TCP三次握手

前置知识:TCP报文格式

在这里插入图片描述
解释:

在这里插入图片描述

三次握手

三次握手过程

在这里插入图片描述

一开始,客户端和服务端都处于“CLOSE”状态,服务端首先进行端口监听,进入“LISTEN“状态

第一次:客户端向服务端发送一个建立连接的请求,TCP报文的SYN字段设置为1,表示希望请求建立连接,客户端随机生成一个tcp的序号,发送完该请求后,客户端处于一个“SYN-SENT”状态。

第二次:服务器端收到客户端发来的请求后,会发送对应的一个确认请求,ACK标志位置为1,SYN字段设置为1,确认应答号设置为客户端序号值 + 1,同时也随机初始化一个序号seq。服务器端进入“SYN_RVD"状态。

第三次:客户端收到服务端确认请求后,还要向客户端发送一个应答报文,其中ACK标志位设置为1,确认应答号设置为 服务端端序号值 + 1, 本次报文可以携带要发送的数据。发送数据后,客户端进入“ESTABLISHED”状态。服务端收到确认后,也进入“ESTABLISHED”状态。三次握手完成。

为什么不是两次握手?

  • 防止历史连接。如果只是两次握手,则服务器对新旧的连接请求都会发送一个确认请求后进入“ESTABLISHED”状态,无法阻止历史连接。
  • 帮助双方同步序号。为了保证传输的有序性和可靠性,TCP采用了发送确认机制,通过发送序号号确认下一个序号来实现,只有三次握手才能保证TCP通信的两端都知道了对方的初始序号。
  • 防止资源的浪费。如果只有两次握手,第一次请求的报文由于网络传输延迟了触发了超时重传机制,客户端再次发送一个请求SYN报文,服务端收到该报文后会直接分配资源建立连接。随后网络延迟的SYN’请求报文到了服务端,会再次分配资源建立连接。
  • 存在半连接问题,如果服务端发送的ACK确认请求丢失了,服务端将认为连接已成功建立并进入等待接收数据的状态。然而,客户端由于没有收到服务器的SYN-ACK,就会超时重传。

参考:小林coding

相关推荐

  1. TCP握手

    2024-04-30 03:10:01       26 阅读
  2. tcp握手

    2024-04-30 03:10:01       55 阅读
  3. TCP握手

    2024-04-30 03:10:01       34 阅读
  4. TCP握手过程

    2024-04-30 03:10:01       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 03:10:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 03:10:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 03:10:01       82 阅读
  4. Python语言-面向对象

    2024-04-30 03:10:01       91 阅读

热门阅读

  1. 10_Scala控制抽象*了解

    2024-04-30 03:10:01       26 阅读
  2. 代码随想录算法训练营第三十五天

    2024-04-30 03:10:01       32 阅读
  3. 【源码】Spring validation参数校验实现原理总结

    2024-04-30 03:10:01       27 阅读
  4. boost::asio::ip::tcp::socket

    2024-04-30 03:10:01       37 阅读
  5. 火绒安全:全面守护你的数字世界

    2024-04-30 03:10:01       34 阅读
  6. web server apache tomcat11-28-Windows Service

    2024-04-30 03:10:01       30 阅读
  7. 如何评判一个算法的好坏,你知道吗

    2024-04-30 03:10:01       29 阅读
  8. go日志记录

    2024-04-30 03:10:01       39 阅读
  9. 关于Android优化

    2024-04-30 03:10:01       30 阅读
  10. ONNX模型

    2024-04-30 03:10:01       34 阅读