TCP连接过程

TCP的链接过程         Qyuan制作

 

序列号和确认序列号

  • 客户端和服务端各自维护一份序列号。

  • 序列号不会只从0或1开始,而是建立连接时有计算机确定一个初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。

  • 在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

  • 单独的ACK包不会消耗序列号

  • 发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。

三次握手: 

  1. 请求端发送给被请求端一个SYN包和初始序列号,这时请求端的状态为SYN_SEND;

  2. 被请求端接收到请求端发送的SYN包后,发送给请求端一个SYN包和ACK包,(确定被请求端的序列号,和收到请求端发来的请求),此时,被请求端的状态为SYN_RCVD

  3. 请求端接收到被请求端发送的SYN+ACK包后,发送给被请求端一个ACK包,(确认收到发送的包);此时请求端状态变为ESTABLISHED;被请求端收到请求端发来的ACK包时,状态变为ESTABLISHED。这时三次握手完成。

三次握手就是通过发送数据包导致客户端和服务端状态的变迁,并且确定包序。 

三次握手在内核完成之后,连接便建立了

收发数据: 

连接建立之后,双方都可以直接向对方发送数据(一般,客户端先进行发送请求,服务端进行应答)

上图中确认收到数据的行为是传输层TCP协议的行为,确认收到的数据会缓存到TCP的接收缓冲区当中。如果应用层程序想要获取,需要调用recv接口去TCP接收缓冲区去拷贝数据

四次挥手:

  1. 主动关闭的一方向另一方发送一个FIN包,请求断开连接。此时主动关闭端的状态转为FIN_WAIT1;

  2. 被动关闭端接收到FIN包后,发送给主动关闭端一个ACK包,确认收到发送的请求。此时被动关闭端状态变为CLOSE_WAIT;主动接收端收到ACK包后,状态变为FIN_WAIT2。

  3. 被动关闭端发送给主动关闭端一个FIN包,进行最后的确认,此时被动关闭端的状态为LAST_ACK。

  4. 主动关闭端接收到FIN包后,回复一个ACK包,状态变为TIME_WAIT;等待2MSL时间,这段时间内没有接收到被动关闭端发来的FIN包,状态变为CLOSED。被动关闭端接收到主动关闭端发送来的ACK包后,关闭。状态为CLOSED.

MSL:最大报文生存时间。发送方报文认为TCP报文在网络当中的最大生存时间。

你们的 【三连】 是给Qyuan最大的肯定!

↓          ↓           ↓

注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值