【Linux 网络】从理论到实践:IP 协议的报头分析与分段技术详解


一、IP 协议的定位

IP:IP 协议提供了一种能力,可以把数据从主机 A 跨网络的送到主机 B 的能力;

TCP:提供可靠性;

TCP / IP :提供可靠的把数据从主机 A 跨网络的送到主机 B 的能力;

二、IP 协议的报头

4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4.

4位头部长度(header length):IP头部的长度是多少个32bit,也就是length 4的字节数.4bit表示最大的数字是15,因此IP头部最大长度是60字节.

8位服务类型(Type OfService):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为O).4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本.这四者相互冲突,只能选择一个.对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要.

16位总长度(total length): IP数据报整体占多少个字节.1

6位标识(id):唯一的标识主机发送的报文.如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的.

3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到).第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文.第三位表示"更多分片",如果分片了的话,最后一个分片置为0,其他是1.类似于一个结束标记.

13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置.实际偏移的字节数是这个值8得到的.因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了).

8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数.一般是64.每次经过一个路由,TTL-=1,一直减到0还没到达,那么就丢弃了.这个字段主要是用来防止出现路由循环。

8位协议:表示上层协议的类型16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏.32位源地址和32位目标地址:表示发送端和接收端.选项字段(不定长,最多40字节):略

问题:IP 报文是如何分离报头和有效载荷的?

答:首部长度 + 总长度

问题:IP 协议如何把报文交给上层?

答:通过 8 位协议表示上层协议的类型;

三、网段划分

为什么要网段划分?

答:提升在全网中定位主机的效率,根据:IP 每次淘汰一个子网的所有主机,其实跟根据学号找学生一样;

是谁划分的?

答:运营商;

IP地址分为两个部分,网络号和主机号;

网络号:保证相互连接的两个网段具有不同的标识;

主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

我们在没有联网的时候,是没有 IP 地址的,所以:我们的 IP 是由路由器分配的;

不同的子网其实就是把网络号相同的主机放到一起,如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复.

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同.

那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情,所以解决方案为:有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便.一般的路由器都带有DHCP功能.因此路由器也可以看做一个DHCP服务器.

目标 IP 能够找到目标主机,是由网络拓扑结构决定的,是子网划分和路由配置决定的;

四、分片和组装

我们学习网络的本质:我们是在学习一个报文的整个生命周期!

因为链路层收到的 IP 报文(有效载荷)大小不能超过 MTU (1500字节),一旦超过,网络层就要进行分片和组装(例如:客户端的网络层进行分片,服务端的网络层进行组装);

结论:分片和传输的过程,传输层不需要知道;

16 位标识是用来标识一个报文的唯一性的,如果分片了,分片报文的标识是相同的;分片不是简单的对 IP 报文进行分片,而是要对每一片添加 IP 报头:一个报文 -> 多个 IP 报文;

13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置.实际偏移的字节数是这个值8得到的.因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了).

3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到).第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文.第三位表示"更多分片",如果分片了的话,最后一个分片置为0,其他是1.类似于一个结束标记.

如何组装:

1、如何区分分片报文和不分片报文?

答:如果更多的标志位为 1,并且最后一片的标志位为0,片偏移大于0;那么就是分片报文;

2、怎么保证挑出来的分片报文是完整的,怎么组装?

答:有第一片:偏移量为0,最后一片:更多标志位为:0,中间片:按照片偏移数字进行升序排序(当前报文的偏移量 = 上一个报文的偏移量 + 他报文的有效载荷的长度);

细节:任意分片会导致整个报文进行重传(TCP 要求重传,而 UDP 真的丢包了);变相的增加丢包的概率;所以 IP 通信过程中,分片就不能成为主流,因为分不分片由传输层说了算,所以这就是为什么 TCP 不把滑动窗口的数据一次性打成一个包发给对方的原因;所以滑动窗口发送的数据不能超过 1460 ;1460 是 MSS 的值;MSS :最大段尺寸;

相关推荐
GGG76619 分钟前
Python 运维自动化:psutil+IPy 系统与网络信息采集深度实战
运维·python·云原生·pip
可乐鸡翅yeah_23 分钟前
个人 / 外包流媒体项目交付实战,M3U8 验收与问题闭环完整工作流
运维·网络·python·低代码·django·m3u8·在线播放
2601_9620715730 分钟前
如何利用SpringSecurity进行认证与授权
java·服务器·数据库
St_rive1 小时前
移动端自动化环境搭建与准备
运维·自动化
w200512241 小时前
Pod管理
linux·服务器·云原生·容器·k8s·podman
INNOVIX稳石机器人1 小时前
稳石500强实战验证:从人工仓储迈向AI自主智造,给出仓储自动化升级标准答案
运维·人工智能·自动化
飞飞传输1 小时前
国产化 MOVEit 替代:文件传输架构与安全能力深度解读
大数据·运维·安全
黄俊懿2 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第十节:网关安全-单向加密
网络·数据库·计算机网络·安全·架构·系统架构·架构师
Patrick在香港2 小时前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
聪明蛋子哟2 小时前
浏览器自动化的“持久身份”:多会话认证与Agent技能的无缝集成实践
运维·自动化