TCP/IP数据报格式

IP数据报格式

IP数据报(datagram)的头部格式如下:

 

 

Version4 bits

版本字段标明建立数据报的IP版本,目前的IP版本是IPv4,IPv6正在发展中。IPv4:0100。

IHL4 bits

IP数据报头部长度(Internet Header Length),度量单位为4 Bytes32 bits),因此IHL始终是4 Bytes32 bits的整数倍,最长可达15 * 4 = 60个字节。IHL最小值为5(即20 Bytes),为不含填充字段和选项字段的最常见的IP数据报头格式。

Type of Service8 bits

服务类型,有3 bitsPrecedence1 bitDelay1 bitThroughout1 bitRelibility2 bitsReserved组成。

其值一般为0x00,表示Routine+Normal Delay+Normal Throughout+Normal Relibility

Total Length16 bits

总长度字段是指整个IP数据报的长度,以字节为单位。理论上,IP数据报最长可达2^16-1=65535 Bytes64KB)。IP数据长度由该字段值减去IHL值计算得到。

Identification16 bits

标识符是发送者为了接收者重组数据报的依据。当一个IP数据报比较大时,可能会被切分成多个数据包(fragments)分多次发送(此时Flags的第二位将置0,第三位置1),接收端依据该字段进行组包。

Flags3 bits

    The internet modules use fields in the internet header to fragment and  reassemble internet datagrams when necessary for transmission through "small packet" networks.

该字段用于分段控制。

第0位为预留位。

第1位表示是否分段,当值为0时,表示数据报将分段;当值为1时,表示数据报不分段(Don't Fragment)。

第2位为段是否还有后续fragment,当值为0时,表示该段是原数据报的最后一段;当值为1时,表示后面还有更多的分段(More Fragments)。

当网络设备要发送的数据报长度比所在网络的最大传输单元(MTU,Max Transfer Unit)大,并且标志位的第1位被置1,即为不分段时,网络设备会向发送方返回一个因特网控制消息协议ICMP错误消息,并丢弃该数据报。除了最后一个分段外,其余分段的第2位均设置为1。

Fragment Offset13 bits

段偏移字段用于指定该分段在原始数据报中的位置,以8 Bytes为度量单位。

Time to Live8 bits

用于指定数据报允许保留在网络上的时间。计量单位为秒,在网络中每被处理一次该值就减小一次。当该值为0时,该数据报将会被销毁。

Protocol8 bits

用于指定数据报数据区中携带的消息是由哪种高级协议建立的。ICMP为1,TCP为6,UDP为17。

Header Checksum16 bits

    IP报头校验和。参考:校验和的计算

Source Address32 bits

    IP地址。

Destination Address32 bits

    目的IP地址。

Optionsvariable

可变长可选项。

Paddingvariable

4字节边界(填零)对齐。

// 定义ip报头数据结构
typedef struct _iphdr {
    byte ver_len;           // 版本4位,头长度4位,报头长度以32位为一个单位
    byte type;              // 类型8位
    byte length[2];         // 总长度,16位,指出报文的以字节为单位的总长度,报文长度不能超过65536个字节,否则认为报文遭到破坏
    byte id[2];             // 报文ID,用于多于一个报文,16位
    byte flag_offset[2];    // 标志,3位数据块偏移,13位
    byte time;              // 生存时间(TTL),8位
    byte protocol;          // 协议,8位
    byte crc_val[2];        // 头校验和,16位
    byte src_addr[4];       // 源IP地址,32位
    byte tar_addr[4];       // 目标IP地址,32位
    byte options[4];        // 选项和填充,32位
} IP_HEADER;

TCP报文格式

传输控制协议(TCP)向上与用户应用程序进程接口,向下与网络层协议IP接口。用户应用程序采用首先调用TCP(或UDP),然后将应用程序数据递交给TCP这一方式,在IP网络上传送数据。TCP将这些数据打包分段并调用IP模块向目的主机传送每个数据段。接收方的TCP将段中的数据放入接收缓冲区,然后将段重装(reassemble)为应用程序数据,再将这些数据发送到目的的应用程序进程。

尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。

TCP提供一种面向连接的、可靠的字节流服务。TCP数据包(package)的头部格式如下:

 

Source Port16 bits

源端口。

Destination Port16 bits

目的端口。

Sequence Number32 bits

在这个报文段中的第一个数据字节的序列号。SYN报文的序列号为初始化序列号(ISN),第一个TCP数据包的序列号为ISN+1

SEQ为对TCP包序列号,其数值为上一次对方发过来的ACK加上本次发出去的数据量。即SEQ2 = ACK1+send

Acknowledgment Number32 bits

只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个序列号。在[SYN,ACK]报文中,ACK=ISN+1

ACK为对上一次的响应(response)和对下一次的期待(expectation),其数值为上一次对方发过来的SEQ加上本次接收到的数据量。即ACK2 = SEQ1+recv

Data Offset4 bits

头部长度/4Byte,即头部长度占了多少个32 bits。没有任何选项字段的TCP头部长度为20字节;TCP头部长度最大为6015*4)字节。

Reserved6 bits

预留给将来使用,必须设置为0

Control Bits6 bits (from left to right)

URG:  Urgent Pointer field significant紧急指针有效位。

ACK:  Acknowledgment field significant确认序号有效位。

PSH:  Push Function接收方应该尽快将这个报文段交给应用层。

RST:  Reset the connection重建连接。如果主机接收到未经请求就进入的数据,接收到不符合预期的ACK,就会用它来重置。

SYN:  Synchronize sequence numbers发起一个连接。

FIN:  No more data from sender,关闭一条连接。

Window16 bits

用来进行流量控制的滑动窗口,单位为字节数。滑动窗口大小为接收方向发送方通知本机当前能够接收的最大数据量。发送方下次发送来的超出滑动窗口的数据将被接收方丢弃。

Checksum16 bits

对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。

Urgent Pointer16 bits

它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。只有当URG标志为1时,紧急数据才有效。

Optionsvariable

可能包括"窗口扩大因子""时间戳"等可选项。

Paddingvariable

4字节边界(填零)对齐。

// 定义TCP报头
typedef struct _tcphdr {
    byte source_port[2];        // 发送端端口号,16位
    byte dest_port[2];          // 接收端端口号,16位
    byte sequence_no[4];        // 32位,标示消息端的数据位于全体数据块的某一字节的数字
    byte ack_no[4];             // 32位,确认号,标示接收端对于发送端接收到数据块数值
    byte offset_reser_con[2];   // 数据偏移4位,预留6位,控制位6为
    byte window[2];             // 窗口16位
    byte checksum[2];           // 校验码,16位
    byte urgen_pointer[2];      // 16位,紧急数据指针
    byte options[3];            // 选项和填充,24位
} TCP_HEADER;

 

参考:

IP数据报格式

TCP报文格式

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TCP/IP详解·卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·卷2:实现》不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·卷2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。 目录 · · · · · · 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和簇引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP分组 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制文协议 第十二章 IP多播 第十三章 IGMP:Internet组管理协议 第十四章 IP多播选路 第十五章 插口层 第十六章 插口I/O 第十七章 插口选项 第十八章 Radix树路由表 第十九章 选路请求和选路消息 第二十章 选路接口 第二十一章 ARP:地址解析协议 第二十二章 协议控制块 第二十三章 UDP:用户数据协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP的函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十一章 BPF:BSD分组过滤程序 第三十二章 原始IP 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值