TCP报文格式及三次握手详解

这篇具有很好参考价值的文章主要介绍了TCP报文格式及三次握手详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.TCP报文格式

TCP 报文是 TCP 层传输的数据单元,也称为报文段。TCP 报文中每个字段如图所示。

TCP报文格式及三次握手详解

 在Wireshark中查看

TCP报文格式及三次握手详解

 

图中 TCP 报文中每个字段的含义如下:

源端口和目的端口字段

  • TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
  • TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。

序列号字段

  • TCP序列号(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。


确认号字段

  • TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。

数据偏移字段

  • TCP 首部长度(Header Length):数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,占 4 位。其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。

保留字段

  • 保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。

标志位字段

  • Nonce (ECN-Nonce):使发送方能够验证 ECN 接收器并且没有其他干扰在信令路径中隐藏标记(或丢弃)的数据包。ECN- Nonce 可以防止实现错误和故意虐待。
  • CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
  • ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
  • URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
  • ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
  • PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
  • RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
  • SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。- SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
  • FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。

窗口大小字段

  • 窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。

TCP 校验和字段

  • 校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。

紧急指针字段

  • 紧急指针(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。

可选项字段

  • 选项(Option):长度不定,但长度必须是 32bits 的整数倍。

二. TCP三次握手

使用 connect() 建立连接时,客户端和服务器端会相互发送三个数据包,请看下图:

TCP报文格式及三次握手详解

 

客户端调用 socket() 函数创建套接字后,因为没有建立连接,所以套接字处于CLOSED状态;服务器端调用 listen() 函数后,套接字进入LISTEN状态,开始监听客户端请求。

这个时候,客户端开始发起请求:

  • 当客户端调用 connect() 函数后,TCP协议会组建一个数据包,并设置 SYN 标志位,表示该数据包是用来建立同步连接的。同时生成一个随机数字 1000,填充“序号(Seq)”字段,表示该数据包的序号。完成这些工作,开始向服务器端发送数据包,客户端就进入了SYN-SEND状态。

服务器生成一个随机数 2000,填充“序号(Seq)”字段。2000 和客户端数据包没有关系。
服务器将客户端数据包序号(1000)加1,得到1001,并用这个数字填充“确认号(Ack)”字段。
服务器将数据包发出,进入SYN-RECV状态。

  • 服务器端收到数据包,检测到已经设置了 SYN 标志位,就知道这是客户端发来的建立连接的“请求包”。服务器端也会组建一个数据包,并设置 SYN 和 ACK 标志位,SYN 表示该数据包用来建立连接,ACK 用来确认收到了刚才客户端发送的数据包。
  • 客户端收到数据包,检测到已经设置了 SYN 和 ACK 标志位,就知道这是服务器发来的“确认包”。客户端会检测“确认号(Ack)”字段,看它的值是否为 1000+1,如果是就说明连接建立成功。

接下来,客户端会继续组建数据包,并设置 ACK 标志位,表示客户端正确接收了服务器发来的“确认包”。同时,将刚才服务器发来的数据包序号(2000)加1,得到 2001,并用这个数字来填充“确认号(Ack)”字段。
客户端将数据包发出,进入ESTABLISED状态,表示连接已经成功建立。
位,就知道这是客户端发来的“确认包”。服务器会检测“确认号(Ack)”字段,看它的值是否为 2000+1,如果是就说明连接建立成功,服务器进入ESTABLISED状态。

  • 服务器端收到数据包,检测到已经设置了 ACK 标志位,就知道这是客户端发来的“确认包”。服务器会检测“确认号(Ack)”字段,看它的值是否为 2000+1,如果是就说明连接建立成功,服务器进入ESTABLISED状态。

至此,客户端和服务器都进入了ESTABLISED状态,连接建立成功,接下来就可以收发数据了。

最后的说明

为什么要三次?通俗一点来说,原因是:客户端和服务端要确认彼此都有收发的能力。

  • 第一次握手:客户端发出连接请求,服务端收到连接请求,至此,服务端知道客户端有发送能力
  • 第二次握手:服务端收到第一次客户端发出的连接请求后,向其发出收到连接请求的响应和连接请求,至此,客户端知道服务端有发送能力和接收能力
  • 第三次握手:客户端收到服务端对它第一次所请求的回应后,发送收到连接请求的响应,服务端收到后,至此,服务端知道客户端有接收能力

服务端和客户端都知道彼此有收发能力后,才可建立连接。所以,至少要三次才能建立连接。

从底层来说,三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号 Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1是否成立,如果成立说明对方正确收到了自己的数据包。


参考链接:https://blog.csdn.net/weixin_44200553/article/details/120582170


 文章来源地址https://www.toymoban.com/news/detail-476382.html

到了这里,关于TCP报文格式及三次握手详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Websocket及三次握手/四次挥手

    Websocket-实时通信 之前一直听说Websocket,但也一直没有使用过,今天突然又看到了,还挺感兴趣的,可以一起看看 原理:浏览器间隔几秒发送一次请求,询问服务器是否有新消息出现,持续 优点:实现简单,大部分浏览器和服务器支持 缺点:频繁的请求和响应会导致不必要

    2024年02月20日
    浏览(46)
  • 【Linux 网络】 传输层协议之TCP协议 && TCP的三次握手和四次挥手

    传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议 基于TCP应用层协议 HTTP HTTPS SSH Telnet FTP SMTP 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去 32位序号/确认序号:TCP的确认应答机制要使用到的字段,保证TCP的可靠

    2024年02月14日
    浏览(53)
  • 【传输层】TCP -- 三次握手四次挥手 | 可靠性与提高性能策略

    主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发 发送方如何判定丢包了呢? 其实真正有没有丢包,发送方其实不知道。定的策略,超时了,就判定丢包了 但是,主机A未收到

    2024年02月10日
    浏览(39)
  • TCP报文与三次握手四次断开、TCP最大连接数与文件打开数限制、keepalive、tcpdump、wireshark抓包分析工具

    tcp详解、tcp与udp对比等 TCP:传输控制协议 UDP:用户数据报协议 源端口和目的端口字段:各占 2 字节(16位)。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接

    2024年04月22日
    浏览(44)
  • 10000字讲解TCP协议(确认应答,超时重传,三次握手,四次挥手等等众多机制)以及UDP协议(UDP报文,校验和)

    UDP它是属于TCP/IP协议族中的一种。是无连接的协议,发送数据前不需要建立连接,因为不需要建立连接,所以可以在网络上以任何可能的路径传输,至于有没有传输到目的地,UDP是不关心的,所以,UDP它是天然支持广播的,就类似学校的广播,只需要将声音传递给每个学生即

    2024年01月21日
    浏览(51)
  • 传输层—TCP核心机制(确认应答、超时重传、三次握手&四次挥手、滑动串口等……)

    ​ 简单给大家介绍一下 TCP 的核心特性,以及报头结构。 TCP 特点: 可靠传输 ,有连接,面向字节流,全双工。(后三个特性,我们在网络编程代码中完全可以感知到) 对于可靠传输来说,是内核实现的,写代码的时候,是感知不到的。(感知成本低,其使用成本也就降低

    2024年02月04日
    浏览(31)
  • TCP三次握手详解

    TCP 传输控制协议  面向连接的可靠传输协议--在完成了传输层的基础工作外,还需要保障传输的可靠性; 面向连接:在传输数据前,需要通过三次握手建立端到端的虚链路 可靠传输:传输过程中使用到4种可靠传输机制;-- 确认、排序、流控(滑动窗口)、重传 TCP建连接三次

    2024年02月15日
    浏览(31)
  • 详解TCP的三次握手

    定义 TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,发送后会启动一个定时器,然后另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据 特点 TCP是面向连接的传输控制层协议 每一条TCP连接只能有两个端

    2024年02月05日
    浏览(40)
  • 【TCP】三次握手(最强详解!!通俗易懂!!)

    SYN和ACK就是两个用于握手和确认建立连接的信号量 就是同步的意思,大概表示的就是发起请求 可以将SYN视为“打招呼”或 “发起请求”的信号 。 在TCP的三次握手过程中,客户端发送一个带有SYN标志的包给服务器,表示客户端请求建立连接。 SYN包中包含一个初始序列号(

    2024年02月03日
    浏览(35)
  • 【TCP】三次握手 与 四次挥手 详解

    在正常情况下,TCP 要经过三次握手建立连接,四次挥手断开连接 服务端状态转化: [CLOSED - LISTEN] 服务器端调用 listen 后进入 LISTEN 状态,等待客户端连接; [LISTEN - SYN_RCVD] 一旦监听到连接请求(同步报文段 SYN),就将该连接放入内核等待队列中,并向客户端发送 SYN + ACK 确认

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包