计算机网络(二)---TCP三次握手四次挥手
本文主要介绍了TCP/IP
的三次握手和四次挥手具体步骤及其原因分析。
更多文章欢迎访问我的个人博客–>幻境云图
1. 三次握手
step1:第一次握手
建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号seq=x,并进入SYN_SENT状态,等待服务器确认。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)。
step2:第二次握手
服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RCVD状态。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号seq(服务器)=y,以及服务器对客户端初始序号的确认号ack(服务器)=seq(客户端)+1=x+1)。
step3:第三次握手
客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发送完毕,客户端和服务器进入**ESTABLISHED **(TCP连接成功)状态,完成三次握手。
|
|
2. 四次挥手
step1:第一次挥手
首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。 客户端进入FIN_WAIT1状态
|
|
step2:第二次挥手
服务器收到这个FIN进入CLOSE_WAIT状态,然后它给客户端发送一个ACK,确认ack为收到的序号加一。
客户端收到ACK应答后进入FIN_WAIT2状态
|
|
step3:第三次挥手
服务端关闭服务器到客户端的连接,发送一个FIN给客户端。服务端进入LAST_ACK状态
|
|
step4:第四次挥手
客户端收到FIN后,进入TIME_WAIT状态 并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。
服务端收到客户端回复的ACK后立即关闭,服务端进入CLOASED状态
而客户端要等待2MSL后关闭 进入CLOASED状态
|
|
3. TIME-WAIT状态详解
为什么Client端要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?
保证TCP协议的全双工连接能够可靠关闭,保证这次连接的重复数据段从网络中消失
假设由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,Client端在等待2MSL时间后都没收到信息,说明Server端已经收到自己发送的ACK并且成功关闭了。 假设CLient端直接关闭了:
|
|
2MSL:Maximum Segment Lifetime 即数据在网络中保存的最大时间。
简单易懂的说法:
|
|
4. TCP 的有限状态机
红色为客户端 蓝色为服务端 细箭头为异常变化
5. 参考
https://www.baidu.com/link?url=_mlor11BLttd1jmMU4k9OP0gqcjNKhZQ9fJuvbMOhkuH9-lVeB-y3VIVK1neZURi_tmR3rg1lj2lfgvvGhTV-q&wd=&eqid=d0144c250007b69c000000035bfdfafc
- 原文作者:意琦行
- 原文链接:https://www.lixueduan.com/post/network/02-tcp-connection/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。