前言
IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一,它为上层提供无状态、无连接、不可靠的服务。
无状态:指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送,传输,接收都是相互独立的。这种服务最大缺点是无法处理乱序和重复的IP数据报。优点是简单高效,和UDP协议与HTTP协议相同,都是无状态协议。
无连接:指IP通信双方都不长久的维持对方的任何信息。这表示上层协议每次发送数据,都需要明确指定对方的IP地址。
不可靠:指IP协议不能IP数据报能准确到达接收端,只是会尽最大努力。一旦发送失败,就通知上层协议,而不会试图重发。
IPv4头部结构
下图是ip协议的包头:

各个部分的含义如下:
- 4位版本号:指定IP协议的版本,对于IPv4来说,其值为4,其它IPv4扩展版本则具有不同的版本号(如SIP协议和PIP协议)
- 4位头部长度:表示IP头部有多少个32bit字(4字节)。因为4位最大15,所以IP头部最长为60字节。
- 8位服务类型:3位优先级权字段(现已被忽略),4位TOS字段和1位保留字段(必须置0).4位TOS字段分别表示:最小延迟,最大吞吐量、最高可靠性和最小费用,其中最多1个能置为1。
- 16位总长度:指整个IP数据包的长度,字节为单位。最长65535字节,由于长度超过MTU的数据报将被分片传输,所以实际传输的长度没有达到最大值。
- 16位标识:唯一标识主机发送的每个数据报。初始值由系统随机生成,每发送一个数据报,其值加一。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片标识值都相同
- 3位标志:第一位保留,第二位表示禁止分片,如果设置了该位,IP数据报长度超过MTU将被丢弃,返回错误。第三位表示更多分片,除了最后一个分片,其它都要置它为1.
- 13位分片偏移:该分片相较于原始IP数据报开始处(仅指数据部分)的偏移。实际偏移值是该值左移3位得到。因此除了最后一个分片,每个分片的数据部分长度必须是8的整数倍。
- 8位生存时间:数据报到达目的地之前允许经过的路由器跳数。每经过一个路由,该值减一,为0时被丢弃,并返回ICMP超时报文。
- 8位协议:用于区分上层协议。ICMP为1,TCP为6,UDP为17。
- 16位头部校验和:由发送端填充,接收端用反码加法校验IPv4头部是否在传输中损坏;它不是CRC,也不校验数据部分。
- 32位源端IP地址:标识数据报的发送端。在传输过程中保持不变
- 32位目的端IP地址:标识数据报的接收端。在普通转发过程中保持不变(NAT等设备可能会改写它)。
- 选项字段:可变长的可选信息,最多40字节。可用的IP选项有:
- 记录路由:将数据包经由的所有路由器IP填入该段。
- 时间戳:将数据报在每个路由器被转发时的时间填入该段。
- 松散源路由选择:指定路由器IP地址列表,数据报发送过程中必须经过其中所有路由器
- 严格源路由选择:类似上面,数据报只能经过被指定的路由器。
抓取一个TCP协议包
开启一个Ubuntu终端,通过tcpdump抓取:
该实验为 VIP 专享内容,
请开通后继续阅读后续 70% 并运行完整示例~
请开通后继续阅读后续 70% 并运行完整示例~
DISCUSSION
评论 0
还没有评论,来留下第一条吧。