TCP三次握手四次挥手

TCP数据报

在这里插入图片描述
为了理解TCP握手和挥手,我们可以简单的认为,数据报就是每次握手/挥手时相互传送的信息,每次都传送一个数据报,需要传送的信息就存在数据报当中,其中比较重要的字段有这样的几个:

  • 序号:随即生成的,用来唯一标志当前数据报,可以理解成数据报的ID
  • 确认号:确认号=刚才接收到的对方的序号+1,具体功能通过下面的握手/挥手过程就可以明白
  • 标志位:用来标志当前数据报的功能,可以同时标志很多功能,Tcp的握手/挥手用到以下标志功能功能(它还可以标志其他功能,感兴趣可以自行搜索):
    • ACK:确认序号有效
    • RST:重置连接
    • SYN:建立连接
    • FIN:断开连接

三次握手

TCP的三次握手指的是过程一共会发送三个数据报,简单描述为

  1. A对B说:我要建立连接
  2. B对A说:好的我同意了
  3. A对B说:那我建立连接了

在这里插入图片描述

  1. 客户端在未建立连接前处于CLOSED状态,这表示客户端无连接
    服务端连接前要处于LISTEN状态,可以通过服务端调用listen()函数实现,这种状态服务端会监控是否有客户端建立连接的请求
  2. 客户端首先向服务端发送一个数据报,标志位为SYN标志这是要请求建立连接的数据报;数据报的序号是随机生成的;发送完之后客户端进入SYN-SEND状态,等待服务端的反馈
  3. 服务端收到数据报之后,自己产生一个数据报,标志位为SYN+ACK,表示服务端确认了建立连接的序号有效;并将 收到的数据报 的序号+1 并存入 自己数据报 的确认号中,然后将数据报发回给客户端,自己进入SYN-RECV状态,等待客户端的回应;
  4. 客户端收到了反馈的数据报,先检查 收到的数据报的 确认号,看它是不是等于自己上次发送数据报序号+1,如果是,自己产生数据报,标志位ACK,将 收到数据报的序号+1存入 自己的数据报的确认号 中,发回给服务端,发送之后自己进入ESTABLISEND状态
  5. 服务端收到数据报,自己进入CLOSED状态,三次握手完成

四次挥手

断开连接时要发送四次数据报,所以被称为四次挥手,三次握手和四次挥手过程类似,就不细讲了,大致过程为:

  1. A对B说:我要断开连接
  2. B对A说:好的我知道了,我准备一下
  3. 过了一会,B对A说:我准备好了,我们断开吧
  4. A对B说:好的,我断开了

在这里插入图片描述他没有直接CLOSED而是先进入TIME_WAIT状态,等待一段时间再CLOSED关闭连接,原因是数据报的发送是只管发送不管是否接收的,确认是否接受要靠对方发来的数据包确认,如果超时没有收到反馈数据报就再发一次
如果最后的数据报客户端发送过去就关闭了,但是服务端没有收到数据报,服务端的连接就关闭不了,所以客户端需要等待一会

数据报在网络中存在由最长生命的,过了这个时间就会自动销毁并通知发送端,报文最大生存时间(MSL,Maximum Segment Lifetime)

TIME_WAIT会等待两个MSL,如果客户端最后发送的数据报没有被服务端接收到,服务端超时,就会重新发给客户端最后的数据报,客户端这时正在等待,等待过程中又收到了服务端的数据报,客户端就知道刚刚的数据报服务端没有接收到,就会重发一次数据报


参考资料:Socket技术讲解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值