TCP 报文格式

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP 报文段的报头有 10 个必需的字段和 1 个可选字段。报头至少为 20 字节。报头后面的数据是可选项。

1)源端口(16位)

标识发送报文的计算机端口或进程。一个 TCP 报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文。

2)目的端口(16位)

标识接收报文的目的主机的端口或进程。

3) 序号(也叫序列号)(32位)

用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。

在 SYN 标志未置位时,该字段指示了用户数据区中第一个字节的序号;在 SYN 标志置位时,该字段指示的是初始发送的序列号。

在建立连接时发送的第一个报文段中,双方都提供一个初始序列号。TCP 标准推荐使用以 4ms 间隔递增 1 的计数器值作为这个初始序列号的值。使用计数器可以防止连接关闭再重新连接时出现相同的序列号。

对于那些包含数据的报文段,报文段中第一个数据字节的数量就是初始序列号,其后数据字节按顺序编号。如果源主机使用同样的连接发送另一个报文段,那么这个报文段的序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送 3 个报文段,每个报文段有 100 字节的数据,且第一个报文段的序列号是 1000,那么第二个报文段的序列号就是 1100(1000 + 100),第三个报文段的序列号就是 1200(1100 + 100)。

如果序列号增大至最大值将复位为 0。

4)确认号(32位)

目的主机返回确认号,使源主机知道某个或几个报文段已被接收。如果 ACK 控制位被设置为 1,则该字段有效。确认号等于顺序接收到的最后一个报文段的序号加 1,这也是目的主机希望下次接收的报文段的序号值。返回确认号后,计算机认为已接收到小于该确认号的所有数据。

例如,序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主 机发送 3 个报文段,每个报文段有 100 字节的数据,且第一个报文段的序列号是 1000,那么接收到第一个报文段后,目的主机返回含确认号1100 的报头。接收到第二个报文段(其序号为 1100 )后,目的主机返回确认号 1200。接收到第三个报文段后,目的主机返回确认号 1300 。

目的主机不一定在每次接收到报文段后都返回确认号。在上面的例子中,目的主机可能等到所有 3 个报文段都收到后,再返回一个含确认号 1300 的报文段,表示已接收到全部 1200 字节的数据。但是如果目的主机再发回确认号之前等待时间过长,源主机会认为数据没有到达目的主机,并自动重发。

上面的例子中,如果目的主机接收到了报文段号为 1000 的第一个报文段以及报文段号为 1200 的最后一个报文段,则可返回确认号 1100,但是再返回确认号 1300 之前,应该等待报文段号为 1100 的中间报文段。

5) 数据偏移(首部长度)(4位)

TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,即首部长度。 由于 TCP 报头的长度随 TCP 选项字段内容的不同而变化,因此报头中包含一个指定报头字段的字段。该字段以 32 比特为单位,所以报头长度一定是 32 比特的整数倍,有时需要在报头末尾补 0 。如果报头没有 TCP 选项字段,则报头长度值为 5 ,表示报头一个有 160 比特,即 20 字节。

6)保留位(6位)

由跟在数据偏移字段后的 6 位构成, 全部为 0 。

7)控制位(6位)

紧急 URG:此位置 1,表明紧急指针字段有效,它告诉系统此报文段中有紧急数据,应尽快传送。

确认 ACK:仅当 ACK = 1 时确认号字段才有效,TCP 规定,在连接建立后所有传达的报文段都必须把 ACK 置 1。

推送 PSH: 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP 就可以使用推送(push)操作,这时,发送方 TCP 把 PSH 置 1 ,并立即创建一个报文段发送出去,接收方收到 PSH = 1 的报文段,就尽快地(即“推送”向前)交付给接收应用进程,而不再等到整个缓存都填满后再向上交付。

复位 RST:用于复位相应的 TCP 连接

同步 SYN:仅在三次握手建立 TCP 连接时有效。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段,对方若同意建立连接,则应在相应的报文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示这是一个连接请求或连接接受报文。

终止 FIN:用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

8)窗口(16位)

此字段用来进行流量控制,这个值是本机期望一次接收的字节数,即发送数据的窗口大小。告诉对方在不等待确认的情况下,可以发来多大的数据。这里表示的最大长度是2^16 - 1 = 65535,如需要使用更大的窗口大小,需要使用选项中的窗口扩大因子选项。

指发送本报文段的一方的接收窗口(而不是自己的发送窗口)。

9)校验和(16位)

源主机和目的主机根据 TCP 报文段以及伪报头的内容计算校验和。在伪报头中存放着来自 IP 报头以及 TCP 报文段长度信息。与 UDP 一样,伪报头并不在网络中传输,并且在校验和中包含伪报头的目的是为了防止目的主机错误地接收存在路由的错误数据报。

伪首部, 又称为伪包头(Pseudo Header):是指在 TCP 的分段或 UDP 的数据报格式中,在数据报首部前面增加源 IP 地址、目的 IP 地址、IP 分组的协议字段、TCP 或 UDP 数据报的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。

10)紧急指针(16位)

仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),即指出了紧急数据的末尾在报文中的位置,注意:即使窗口为零时也可发送紧急数据。

如果 URG 为 1 ,则紧急指针标志着紧急数据的结束。其值是紧急数据最后 1 字节的序号,表示报文段序号的偏移量。例如,如果报文段的序号是 1000,前 8 个字节都是紧急数据,那么紧急指针就是 8 。紧急指针一般用途是使用户可中止进程。

11)选项、填充字段

可能包括“窗口扩大因子”、“时间戳”等选项。长度可变,最长可达 40 字节,当没有使用选项时,TCP 首部长度是 20 字节。

填充用于保证任选项为 32bit 的整数倍。

12)数据(长度可变)

TCP 首部结束之后的部分

UDP 报文格式

 

UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

1)源端口(2 字节):发送方端口号

2)目的端口(2 字节 ):接收方端口号

3)报文长度(2 字节):UDP 用户数据报的总长度,以字节为单位。

4)校验和(2 字节):检测 UDP 用户数据报在传输中是否有错,有错就丢弃。

用于校验 UDP 数据报的数字段和包含 UDP 数据报首部的“伪首部”。

伪首部, 又称为伪包头(Pseudo Header):是指在 TCP 的分段或 UDP 的数据报格式中,在数据报首部前面增加源 IP 地址、目的 IP 地址、IP 分组的协议字段、TCP 或 UDP 数据报的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。

5)数据:UDP 的数据部分如果不为偶数需要用 0 填补,就是说,如果数据长度为奇数,数据长度加“1”。

TCP数据段格式+UDP数据段格式详解的更多相关文章

  1. [转载]MAC、IP头、TCP头、UDP头帧格式、详解

    原文地址:MAC.IP头.TCP头.UDP头帧格式.详解作者:iTudu 转自:http://zoufengfu168.blog.163.com/blog/static/546105520099133 ...

  2. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

  3. 图解大数据 | 海量数据库查询-Hive与HBase详解

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/84 本文地址:http://www.showmeai.tech/article-det ...

  4. SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...

  5. JSON详解+ C# String.Format格式说明+ C# ListView用法详解 很完整

    JSON详解 C# String.Format格式说明 C# ListView用法详解 很完整

  6. TCP三次握手与四次挥手详解

    目录 TCP三次握手与四次挥手详解 1.TCP报文格式 2.TCP三次握手 3.TCP四次挥手 4.为什么建立连接需要三次握手? 5.为什么断开连接需要四次挥手? 6.为什么TIME_WAIT状态还需 ...

  7. TCP/UDP Linux网络编程详解

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...

  8. 大数据量高并发的数据库优化详解(MSSQL)

    转载自:http://www.jb51.net/article/71041.htm 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能. ...

  9. TCP、UDP和HTTP区别详解

    http:是用于www浏览的一个协议.tcp:是机器之间建立连接用的到的一个协议. 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层.在网络层有IP协议.ICMP协议.ARP协议.R ...

随机推荐

  1. Prefix and Suffix Search

    Given many words, words[i] has weight i. Design a class WordFilter that supports one function, WordF ...

  2. Linux:shift 命令可以将参数依次向左移动一个位置

    在脚本中,命令行参数可以依据其在命令行中的位置来访问.第一个参数是 $1 ,第二个参数 是 $2 ,以此类推. 下面的语句可以显示出前3个命令行参数: echo $1 $2 $3 更为常见的处理方式是 ...

  3. P1003铺地毯

    这道题是2011年提高组第一题,在洛谷被评为普及-.看到题目后直接写了一个纯模拟,结果第一次提交全部RE,后将数组开大,随即MLE.然后又去思索其余方法,采用先将每一个地毯的对角线存下来,然后i--看 ...

  4. phpstudy 最新版linux 面板 web防火墙后门防护功能教程

    phpstudy linux 面板针对服务器和网站做了全面的安全防护措施,尽可能的防范网站被入侵,留置后门风险,本篇文章着重介绍phpstudy linux 面板其中的一项安全功能 [网站防火墙]之[ ...

  5. lnmp1.5部署laravel项目

    毕竟laravel是十分有魅力的框架,忍不住想要深入的了解她,费话不多说,直入正题吧 1.composer切换国内镜像源:composer config -g repo.packagist compo ...

  6. h5中的分组元素figure、figcaption、hgroup元素介绍

    分组元素用于对页面中的内容进行分组. figure元素和figcaption元素 figure元素用于定义独立的流内容(图像.图表.照片.代码等),一般指一个独立的单元.figure元素的内容应该与主 ...

  7. Codeforces 1244F. Chips

    传送门 显然可以注意到连续的两个相同颜色的位置颜色是不会改变的,并且它还会把自己的颜色每秒往外扩展一个位置 同时对于 $BWBWBW...$ 这样的序列,它每个位置的颜色每一秒变化一次 然后可以发现, ...

  8. ns nat rule

    ns nat rule NAT实现方式: NAT的实现方式有三种,即静态转换(Static Nat).动态转换(Dynamic Nat) 和 端口多路复用(OverLoad). 静态转换是指将内部网络 ...

  9. JS基础_对象字面量

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. IOS 伪类:active失效

    IOS中不兼容:active伪类,所以在状态控制上就会有问题,解决办法是,添加一个空的点击事件: 移动端添加:ontouchstart <a class="m-btn" on ...