TCP三次握手过程

什么是TCP

tcp是一个面向连接的、可靠的、基于字节流的传输层通信协议

  • 面向连接:TCP连接是一对一的,不能实现一对多或多对一,TCP在通信前要首先建立连接,连接成功后才能开始进行通信
  • 可靠的:TCP连接要保证通信过程的可靠性,所谓可靠性是指TCP能够检查比特错误并纠正比特错误,同时能够对丢包、失序情况作出一定的应对。
  • 基于字节流:在 TCP 建立连接之后,数据被视为一个连续的字节流

为什么需要TCP

由于下层网络层(IP层)不保证网络包的交付、按序交付和数据的完整性,因此需要TCP协议在运输层保证数据传输的可靠性。

TCP报文头格式

各字段作用:

  • 序列号
    • 连接建立时该值是随机初始化的。其后在数据传输过程中,TCP 连接中传送的数据流中的每一个字节都编上一个序号,而序号字段的值则指的是本报文段所发送的数据的第一个字节的序号,以保证数据传输过程中不乱序。
    • 用来解决网络包的失序问题
  • 确认应答号
    • 期望收到对方的下一个报文段的数据的第一个字节的序号,发送端在收到确认应答后可认为在该序号之前的数据都已经被接收端正常接收。
    • 用以解决网络丢包的问题
  • 控制位:
    • ACK,该位为1时,确认应答号有效
    • SYN,该位为1,连接建立号,建立TCP连接所使用特殊字段,该位为1表示希望建立连接
    • FIN,同SYN字段的作用,是TCP断开连接时需要的特殊字段,该位为1表示希望断开连接
    • RST,该位为1,表示出现异常情况,需要强制断开连接
  • 源端口与目的端口
    • 用于告诉TCP协议应该把网络数据包交给哪个进程
  • 首部长度
    • 指出TCP报文的首部长度,单位为4字节,取值范围为0~15,故而TCP报文段的首部长度最大为60字节,固定字段为20字节,因此选项部分最大为40字节

如何确定一个TCP连接

一个TCP四元组可以确定一个TCP连接,其四元组组成为:

其中,源地址与目的地址在IP头部中,作用是将数据包通过IP协议发送给主机

源端口与目的端口存在于TCP头部中,作用是告诉TCP协议应该把报文发送给哪个进程

TCP建立连接的过程

TCP在通信前需要首先通过三次握手建立连接,之后才能进行通信,其过程如下:

  • 第一次握手:客户端发送SYN报文段,在tcp头部中,置SYN=1,并随机初始一个seq序号,但不携带任何数据。表示客户端要建立连接
  • 第二次握手:服务端收到客户端发来的链接请求后,在tcp头部中,置SYN=1,也随机初始化一个服务端的序号seq放入tcp头部,同时置ACK=1,对客户端也响应一个确认号ack放入头部,该阶段同样不携带数据。表示服务端同意建立连接
  • 第三次握手:客户端收到服务端的同意链接请求报文,此时服务端已经做好了要连接并发送数据的准备,要对服务端发送一个确认报文。在tcp头部中,置ACK=1,但SYN=0,且此后的数据传输过程中SYN都等于0,同时对服务端的序号响应一个确认号,在该阶段,客户端可以携带数据发送给服务端

参考:
4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com)

相关推荐

  1. TCP握手过程

    2023-12-05 23:24:04       29 阅读
  2. TCP握手

    2023-12-05 23:24:04       27 阅读

最近更新

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

    2023-12-05 23:24:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-05 23:24:04       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-05 23:24:04       87 阅读
  4. Python语言-面向对象

    2023-12-05 23:24:04       97 阅读

热门阅读

  1. 在oracle的scn详细说明

    2023-12-05 23:24:04       56 阅读
  2. Go map类型

    2023-12-05 23:24:04       61 阅读
  3. error转string

    2023-12-05 23:24:04       53 阅读
  4. SpringMVC消息转换器 对日期类型进行统一格式化

    2023-12-05 23:24:04       51 阅读
  5. Golang WebSocket 心跳

    2023-12-05 23:24:04       59 阅读
  6. 在Spring Boot中配置@Async的线程池的拒绝策略

    2023-12-05 23:24:04       57 阅读
  7. Spring Boot 最核心的 25 个注解

    2023-12-05 23:24:04       50 阅读
  8. Cpp之旅(学习笔记)第10章 字符串和正则表达式

    2023-12-05 23:24:04       49 阅读
  9. 说说过量 tcp pure ack 的利弊

    2023-12-05 23:24:04       58 阅读
  10. React 基础使用

    2023-12-05 23:24:04       57 阅读
  11. ElasticSearch之Delete index API

    2023-12-05 23:24:04       69 阅读