计算机网络:运输层 —— TCP 的 “三次握手” 与 “四次挥手”
文章目录
TCP的运输连接管理
TCP是面向连接的协议,它基于运输连接来传送TCP报文段。TCP运输连接的建立和释放,是每一次面向连接的通信中必不可少的过程。
TCP运输连接有以下三个阶段:
-
通过“三报文握手”来建立TCP连接。
-
基于已建立的TCP连接进行可靠的数据传输。
-
在数据传输结束后,还要通过“四报文挥手”来释放TCP连接。
“三报文握手”建立TCP连接
TCP 三次握手是 TCP 协议建立连接的过程,通过三次握手,客户端和服务端能够确认彼此的存在,并同步彼此的状态,建立起可靠的通信信道
解决的主要问题
“三报文握手”建立TCP连接的目的在于解决以下三个主要问题:
-
使TCP双方能够确知对方的存在。
-
使TCP双方能够协商一些参数(例如最大报文段长度、最大窗口大小、时间戳选项等)
-
使TCP双方能够对运输实体资源进行分配和初始化。运输实体资源包括缓存大小、各状态变量、连接表中的项目等。
三报文握手的过程
TCP客户:主动发起TCP连接的主机中的某个应用进程
TCP服务器:主机中被动等待TCP连接的应用进程
监听状态
可以将TCP建立连接的过程比喻为握手,握手需要在TCP客户和服务器之间交换三个TCP报文段。
-
最初,两端的TCP进程都处于关闭状态,TCP服务器进程首先创建传输控制块,用来存储TCP连接中的一些重要信息。
-
之后,TCP服务器就进入监听状态,等待TCP客户进程的连接请求。
由于TCP服务器进程是被动等待,来自TCP客户进程的连接请求,而不是主动发起,因此称为被动打开连接。TCP客户进程也要首先创建传输控制块。
第一次握手
TCP客户端在打算建立TCP连接时,向TCP服务器进程发送TCP连接请求报文段,,向服务端告知自己想要建立连接,进入同步已发送状态。由于 TCP 连接是由 TCP 客户进程主动发起的,因此称为主动打开连接。
-
TCP 连接请求报文段和 TCP 连接请求确认报文段首部中的同步标志位
SYN
的值必须设置为1(不能携带数据,但要消耗掉一个序号) -
序号
seq
字段被设置了一个初始值 x,作为TCP客户进程所选择的初始序号
第二次握手
TCP服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并进入同步已接收状态。
-
TCP连接请求确认报文段首部中的同步标志位SYN和确认标志位ACK的值都设置为1,表明这是一个TCP连接请求确认报文段。
-
序号
seq
字段被设置了一个初始值y
,作为TCP服务器进程所选择的初始序号。 -
TCP规定同步标志位SYN被设置为1的报文段(例如TCP连接请求报文段和TCP连接请求确认报文段)不能携带数据,但要消耗掉一个序号。
-
确认号
ack
字段的值被设置为x+1
,这是对TCP客户进程所选择的初始序号 x 的确认。
第三次握手
TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程,发送一个普通的TCP确认报文段,并进入连接已建立状态。
TCP 服务进程收到针对 TCP 连接请求确认报文段的普通 TCP 确认报文段后,也进入连接已建立状态。
此时,TCP双方都进入了连接已建立状态,它们可以基于已建立的TCP连接,进行可靠的数据传输了。
-
确认标志位
ACK
的值被设置为1,表明这是一个普通的 TCP 确认报文段 -
因为 TCP 客户进程之前发送的 TCP 连接请求报文段的序号为
x
,该报文段虽然不能携带数据,但要消耗掉一个序号。因此 TCP 客户进程发送的第二个报文段的序号为x+1
。 -
TCP规定,普通的TCP确认报文段可以携带数据,但如果不携带数据,则不消耗序号。如果该报文段不携带数据,则TCP客户进程要发送的下一个数据报文段的号仍为x+1。
-
确认号
ack
字段的值被设置为y+1
,这是对 TCP 服务器进程所选择的初始序号y
的确认
使用“三报文握手”建立TCP连接的原因
使用“三报文握手”而不是“两报文握手”建立TCP连接的原因,是为了防止已失效的TCP连接请求报文段突然又传送到了TCP服务器进程,因而导致错误,资源浪费。
四报文挥手释放TCP连接
可以将TCP释放连接的过程比喻为挥手,挥手需要在TCP客户和服务器之间交换四个TCP报文段。
四报文挥手的过程
第一次挥手
假设使用 TCP 客户进程的应用进程,通知其主动关闭TCP连接,TCP客户进程会发送TCP连接释放报文段,并进入终止等待1状态。
-
TCP连接释放报文段首部中的终止标志位FIN和确认标志位ACK的值都被设置为1。表明这是一个TCP连接释放报文段,同时也对之前收到的 TCP 报文段进行确认
-
序号seq字段的值设置为
u
,它等于TCP客户进程之前已经传送过的数据的最后一个字节的序号加1。 -
TCP规定,终止标志位FIN等于1的TCP报文段即使不携带数据,也要消耗掉一个序号。
-
确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的数据的最后一个字节的序号加1。
第二次挥手
TCP服务器进程收到TCP连接释放报文段后,发送一个TCP普通确认报文段并进入关闭等待状态。
-
确认标志位ACK的值被设置为1,表明这是一个TCP普通确认报文段
-
序号seq字段的值设置为
v
,它等于TCP服务器进程之前已传送过的数据的最后一个字节的序号加1,与之前收到的 TCP 连接释放报文段中的确认号 v 匹配。 -
确认号ack字段的值设置为
u+1
,这是对TCP连接释放报文段的确认。
TCP服务器进程这时应通知高层应用进程,TCP客户进程要断开与自己的TCP连接,此时,从TCP客户进程到TCP服务器进程这个方向的连接就释放了。此时的TCP连接属于半关闭状态。
第三次挥手
TCP客户进程收到该普通的TCP确认报文段后,就进入终止等待2状态,等待TCP服务器进程发出的TCP连接释放报文段。
若使用TCP服务器进程的应用进程已经没有数据要发送了,应用进程就通知其TCP服务器进程释放连接。由于TCP连接释放是由TCP客户进程主动发起的,因此,TCP服务器进程对TCP连接的释放称为被动关闭连接。
TCP服务器进程发送TCP连接释放报文段,并进入最后确认状态。
-
TCP连接释放报文段首部中的终止标志位 FIN 和确认标志位 ACK 的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的TCP报文段进行确认。
-
序号 seq 字段的值假定被设置为w,这是因为在半关闭状态下,TCP服务器进程可能又发送了一些数据。
-
确认号 ack字段的值被设置为
u+1
,这是对之前收到的TCP连接释放报文段的重复确认。
第四次挥手
TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态。
TCP服务器进程收到该普通的 TCP确认报文段后,就进入关闭状态,服务器进程撤销相应的传输控制块,而TCP客户进程还要经过2MSL(最长报文段寿命,Maximum Segment Lifetime)后,才能进入关闭状态。
这完全是从工程上来考虑的。对于现在的网络,MSL取为2分钟可能太长了,因此TCP允许不同的实现可根据具体情况使用更小的MSL值。
客户进程撤销相应的传输控制块后,就结束了这次的TCP连接。
-
确认标志位
ACK
的值设置为1,表明这是一个TCP普通确认报文段 -
序号
seq
字段的值设置为u+1
,这是因为TCP客户进程之前发送的TCP连接释放报文段虽然不携带数据,但要消耗掉一个序号 -
确认号
ack
字段的值设置为w+1
,这是对所收到的TCP连接释放报文段的确认。
时间等待状态经过2MSL时长的原因
处于时间等待(TIME-WAIT)状态后要经过 2MSL
时长,可以确保TCP服务器进程能够收到最后一个TCP确认报文段而进入关闭(CLOSED)状态。
TCP客户进程在发送完最后一个TCP确认报文段后,再经过2MSL时长,就可以使本次连接持续时间内所产生的的所有报文段都从网络中消失。这样就可以使下一个新的TCP连接中不会出现旧连接中的报文段。
TCP保活计时器的作用
假设TCP双方已经建立了连接,TCP客户进程所在的主机突然出现了故障,因此,TCP客户不可能再发送数据给TCP服务器。TCP服务器进程使用保活计时器可得知TCP客户进程出现的上述问题。
TCP服务器进程每收到一次TCP客户进程的数据,就重新设置并启动保活计时器(通常为两小时)。当TCP服务器中的保活计时器到时后,TCP服务器进程就向TCP客户进程,每隔75s发送一个探测报文段。若一连发送10个探测报文段后仍无TCP客户进程的响应,TCP服务器进程就认为TCP客户进程所在主机出了故障,于是就关闭这个连接。
原文地址:https://blog.csdn.net/Zachyy/article/details/143785641
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!