计算机网络——TCP三次握手与四次挥手
字段 | 含义 |
---|---|
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阶段的原因。
- 点赞
- 收藏
- 分享
- 文章举报
- 【计算机网络】TCP三次握手、四次挥手
- 【计算机网络】TCP三次握手四次挥手
- 计算机网络tcp协议三次握手四次挥手
- 计算机网络基础(四)TCP协议中的三次握手和四次挥手(图解)
- 【计算机网络】TCP三次握手和四次挥手
- 计算机网络-运输层-TCP运输连接管理(三次握手四次挥手)
- 计算机网络笔记--TCP三次握手与四次挥手过程状态分析
- 面试之计算机网络TCP协议——三次握手与四次挥手
- 计算机网络基础知识(TCP的三次握手与四次挥手)
- 计算机网络-----TCP/IP三次握手和四次挥手
- 计算机网络三次握手和四次挥手
- Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
- TCP网络通信三次握手与四次挥手
- TCP VS UDP 网络协议模型 TCP/IP 协议模型 三次握手 四次挥手
- 网络基础②-TCP 三次握手与四次挥手
- 【java面试系列之网络编程】TCP和UDP的区别、TCP协议的三次握手和四次挥手、TCP协议的通信状态、网络编程时的同步、异步、阻塞、非阻塞、进程间的通信方式、TCP的流量控制和拥塞控制
- java 网络编程——TCP 的三次握手和四次挥手
- 计算机网络 —— 三次握手 与 四次挥手
- Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
- 【网络编程】TCP通讯时序详解(三次握手和四次挥手)