您的位置:首页 > 理论基础

计算机网络——TCP三次握手与四次挥手

2020-04-21 19:50 489 查看
字段 含义
URG(urgent) 紧急指针是否有效。为1,表示需要被优先处理
ACK(acknowledge character) 确认字符,确认号是否有效,一般置为1。
PSH(push) 提示接收端应用程序立即从TCP缓冲区把数据读走,不再等待。
RST(reset) 对方要求重新建立连接,复位。
SYN(synchronize sequence numbers) 同步序列编号,请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN(finish) 希望断开连接。
seq(sequence) 发送序号
ack(acknowledge numbers) 确认序号,期待下一个发送序号(seq+1)


【问题】为什么要三次“握手”?
       1.TCP的三次握手防止已过期的连接再次传到被连接的主机。当客户端请求连接服务器,客户端发送的

SYN=1,seq=x
由于某种原因未能及时到达,客户端再次发送请求,客户端和服务器成功连接并断开连接后,由于某种原因未能及时到达的请求在断开后到达,服务器以为客户机要请求连接。
       2.由于客户端和服务器初始序列号(seq)是随机产生的,需要告知对方自己的初始序列号,需要得到确认(ack)。
       3.两次握手可能发生死锁。客户端向服务器发送请求,服务器收到请求,同意连接,并向客户端发送确认(ack),但确认请求在传输过程中被丢失。在这种情况下,客户端由于没有收到确认,认为还没建立连接,客户端继续发送请求,但服务器认为已经建立了连接,丢弃了请求。


【问题】为什么是四次“挥手”?
       TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?
       建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。
       释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

【问题】为什么不能用两次握手进行连接?
       三次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
       现在把三次握手改成仅需要两次握手,可能会发生死锁。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题】如果已经建立了连接,但是客户端突然出现故障了怎么办?
       TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

【问题】为什么客户端在TIME-WAIT阶段要等2MSL?
       为的是确认服务器端是否收到客户端发出的ACK确认报文
       当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。
       服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;
       如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。
       所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
weixin_38386804 发布了8 篇原创文章 · 获赞 48 · 访问量 1303 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: