TCP的三次握手和四次挥手

目录

1️⃣TCP协议格式

2️⃣TCP三次握手

3️⃣TCP四次挥手


 

1️⃣TCP协议格式

9d9ebc2322fd42e3b2309c1604cd4b2a.png

 

TCP报头当中各个字段的含义如下:

  • 源/目的端口号:表示数据是从哪个进程来,到发送到对端主机上的哪个进程。
  • 32位序号/32位确认序号:分别代表TCP报文当中每个字节数据的编号以及对对方的确认,是TCP保证可靠性的重要字段。
  • 4位TCP报头长度:表示该TCP报头的长度,以4字节为单位。
  • 6位保留字段:TCP报头中暂时未使用的6个比特位。
  • 16位窗口大小:保证TCP可靠性机制和效率提升机制的重要字段。
  • 16位检验和:由发送端填充,采用CRC校验。接收端校验不通过,则认为接收到的数据有问题。(检验和包含TCP首部+TCP数据部分)
  • 16位紧急指针:标识紧急数据在报文中的偏移量,需要配合标志字段当中的URG字段统一使用。
  • 选项字段:TCP报头当中允许携带额外的选项字段,最多40字节。

TCP报头当中的6位标志位:

  • URG:紧急指针是否有效。
  • ACK:确认序号是否有效。
  • PSH:提示接收端应用程序立刻将TCP接收缓冲区当中的数据读走。
  • RST:表示要求对方重新建立连接。我们把携带RST标识的报文称为复位报文段。
  • SYN:表示请求与对方建立连接。我们把携带SYN标识的报文称为同步报文段。
  • FIN:通知对方,本端要关闭了。我们把携带FIN标识的报文称为结束报文段。

2️⃣TCP三次握手

677f29e3ed4c4f79ac1fa392afc402fa.png

  • 第一次握手:建立连接。客户端发送连接请求报文,将SYN置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。
  • 第二次握手:服务器收到SYN报文段。需要对这个SYN报文段进行确认,设置ACK为x+1;同时发送SYN请求信息,将SYN置为1,Sequence Number为y ;发送SYN+ACK报文段给客户端,此时服务器进入SYN_RECV状态。
  • 第三次握手:客户端收到服务器发送的SYN+ACK报文段。然后将ACK设为Y+1,向服务器发送ACK报文段确认应答。客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

为什么一定进行三次握手? 

        三次握手完成两个重要功能:双方做好发送数据的准备工作;双方就初始序列号进行协商。

如果现在把三次握手改为两次握手,可能发送死锁!!

        假定一个客户端给服务端发送一个SYN请求连接,服务端收到SYN请求,发送确认应答ACK,此时已经完成了两次握手。但服务端发送了确认应答,客户端却可能未收到,此时客户端不知道服务端是否做好了准备,不知道服务端建立什么样的序列号,甚至怀疑服务端是否收到自己的连接请求。在这种情况下,客户端认为连接还未建立成功,将忽略服务端发来的任何数据分组,只等待连接确认应答分组。而服务端发出的分组超时后,重复发送同样的分组,这样就形成死锁。 

3️⃣TCP四次挥手

当数据传送完毕后,就需要断开TCP连接,此时就产生了TCP的四次挥手,以下采取客户端发起断开连接请求讲解。

62c8efdb45db4756a7473821dd32064f.png

  • 第一次挥手:客户端设置Seq和Ack,向服务端发送一个FIN报文段;此时,客户端进入FIN_WAIT_1状态;这表示客户端没有数据要发送给服务端了。
  • 第二次挥手:服务端收到客户端发送的FIN报文段,向客户端发送确认应答ACK报文段,ACK为Seq+1,客户端进入FIN_WAIT_2状态;服务端告诉客户端,我同意你的关闭请求。
  • 第三次挥手:服务端向客户端发送FIN报文段,请求关闭连接,服务端进入LAST_ACK状态。
  • 第四次挥手:客户端收到服务端发送的FIN报文段,向服务端发送ACK确认应答报文段,客户端进入TIME_WAIT状态;此时客户端等待2MSL后依然没有收到回复,则证明服务端已正常关闭,那么客户端也可以关闭连接了。

为什么TIME_WAIT状态下要等待2MSL?

MSL:数据包在网络中的最大生存时间。 2MSL是最大报文段生存时间。

        TIME_WAIT状态是为了等待连接上所有的分组的消失。假如单纯认为发送端只需要等待一个MSL的话,此时发送端发送ACK报文段后就关闭,如果ACK报文段丢失,接受端处在LAST_WAIT状态下,未接收到 ACK报文段,此时就无法正常进入关闭连接状态。

        而等待2MSL,接受端未接收到ACK报文段,则超时重传FIN请求报文段,发送端发送ACK应答报文段,重新启动时间等待计时器,最后都能正常的关闭。

 

 

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值