TCP的三次握手和四次挥手

前言

TCP报文格式(标志位,确认号,序列号):
FIN:finish,结束

PSH:push,传输

SYN:synchronous,建立连接

RST:reset,重置

ACK:acknowledgement:确认

seq:sequence number 序列号

需要注意的是序列列号不会从0或者1开始,而是在建立连接的时候由计算机生成一个随机数作为初始值,通过SYN包发送给主机,然后每次转发过去的字节数累加到初始值上表示数据的位置;

ack:acknowledge number 确认号
表示下一次应该收到的是数据的序列号,发送端收到这个确认应答以后可以认为在这个序列号之前的数据都已经被正常接收;

TCP的三次握手

三次握手的过程

clipboard-2018928

  • 第一次握手:Client将标志位SYN置为1,随机产生一个seq=J,并将该数据报发送给Server,Client进入到SYN_SENT状态,等待Server确认;
  • 第二次握手:Server收到数据包后由SYN=1知道Client需要建立连接,Server将标志位SYN置为1,同时ACK置为1,ack=J+1,随机产生一个seq=K,并将该数据包发送给Client确认连接请求,同时Server进入到SYN_SCVD状态;
  • 第三次握手:Client收到信息后,检查ack是否等于J+1,ACK是否为1,如果正确将标志位ACK置为1,ack=K+1,并将该数据报发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确就建立连接成功,Client和Server进入到ESTABLISHED状态,完成三次握手;随后进行数据的传输;

    TCP的四次挥手

    所谓的四次挥手就是终止TCP的连接,需要客户端和服务端总共发送四个包确认连接的断开;

clipboard11-2018928

因为TCP的连接是全双工的,因此每个方向都需要单独的进行关闭,这个原则是当一方完成数据发送的任务后,发送一个FIN来终止在这一方向上的连接,收到FIN只是意味着这一方向上面没有数据流动了,不会再收到数据了,但是在这个TCP连接上海市可以发送数据的,直到这一方向上也发送了FIN;

四次挥手过程:

  • 第一次挥手:Client发送一个FIN,同时发送一个数据包M,用来关闭Client到Server的数据传送,Client进入到FIN_WAIT_1状态;
  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到的序号M+1,Server进入到CLOSE_WAIT状态;
  • 第三次挥手:Server发送一个FIN,用来关闭从Server到Client的数据传送,Server进入到LAST_ACK状态;
  • 第四次挥手:Client收到FIN后,Client进入到TIME_WAIT状态,接着发送一个ACK到Server,确认序号为收到的序号+1,Server进入到Close状态,完成四次挥手;

总结

为什么连接的时候是三次,断开的时候需要四次?

  • 服务端在Listen状态下,收到客户端的请求连接的SYN报文后,将ACK和SYN放在一个报文中发送给客户端;
  • 在关闭连接的时候,TCP的连接是全双工的,可以两端同时发送数据,收到客户端传过来的FIN报文的时候,仅仅代表客户端不再发送数据了,当时还是可以接收到数据的;而且服务端也未必已经全部将数据发送到了客户端,这个时候可以再将未发送完全的数据继续发送,再发送FIN给客户端表示可以关闭连接。服务端的ACK和FIN一般是分开发送;
-------------The End-------------

本文标题:TCP的三次握手和四次挥手

文章作者:Dimple

发布时间:2018年09月28日 - 16:09

最后更新:2018年09月28日 - 17:09

原始链接:http://www.bianxiaofeng.com/2018/09/28/2018-9-28-16-43-30/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

na,给我一个棒棒糖!
0%