您的位置:首页 > 理论基础 > 计算机网络

TCP/IP三次握手与四次挥手总结

2016-10-24 17:24 441 查看

三次握手:

  客户端A    服务端B

1. A发出请求联机,SYN=1和seq number=i的SYN包给B,并进入SYN_SEND状态

2. B收到后确认联机信息 ,向A发送ACK包(ack=1,ack number=i+1)和一个SYN包(syn=1,seq number=k)给A ,此时B进入SYN_RECE状态

3. A收到B发来的SYN+ACK包,检查ack number是否是i+1和ack标志位是否是1,如果是则向服务端B发送确认包ACK(ack number=k+1,ack=1),此包发送完毕客户端和服务端都进入established状态,完成三次握手。

 四次挥手:

1. A向B发送TCP包,用了关闭客户端到服务端的数据传送,将标志FIN=1,seq number=i,A进入FIN_WAIT1状态。

2. B收到FIN后,发送一个ACK(ack=1,ack number=i+1)还有一个seq number=j 给A, B进入CLOSE_WAIT(因为服务器B向A发送的数据不一定也发完)状态,A收到回应ACK报文后进入FIN_WAIT2状态

3. 服务器B发送一个TCP包,用来关闭服务端到客户端的数据传送,标志位FIN=1,ACK=1,seq number=k,ack number= i+1,B进入LAST_ACK状态

4.A收到FIN后,A进入TIME_WAIT,接着发送一个ACK(ack=1ack number=k+1)和seq number=i+1给B,B收到后进入CLOSED状,A还要等待2倍的MSL时间进入Closed状态

MSL(Maximum Segment Lifetime)报文最长存活时间

为什么建立连接协议是三次握手,而关闭是四次握手呢?

  因为服务端LISTEN状态下的SOCKET当收到SYN报文的建立请求后,可以把ACK和SYN放在一个报文里来发送,但是关闭连接的时候,当收到对方的FIN报文时,它只是表示对方没有数据可发了,但是你的数据未必全部发送给对方,所以未必会马上关闭SOCKET,所有可以先发个ACK报文给对方,等自己的数据全部发完给对方后,再发FIN报文来表示自己现在可以关闭连接了。所以ACK报文和FIN报文大多数是分开发的。

 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

  因为无法保证最后发送的ACK报文一定会被对方收到,也就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用是用来重发可能丢失的ACK报文。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCPIP