一、IP协议的功能
提供将数据从A主机跨网络送到主机B的能力 (在复杂的网络环境中确定一个合适的路径)
二、IP协议格式
1.报头的含义
(1)一般字段
① 4位版本:指定IP协议的版本,对于IPv4来说就是4
② 4位首部长度:IP报头 = 4位首部长度 * 4字节 -> [20, 60] -> [1010, 1111] (同TCP)
③ 8位服务类型:用于指定服务类型(不太重要)
④ 16位总长度:整个IP报文占多少个字节(IP报头 + 有效载荷)
⑤ 8位生存时间:每跳一次,生存时间- -;当减到0时就不发这个报文了(解决环路问题)
⑥ 8位协议:表示上层协议的类型(交给UDP还是TCP;解决分用的问题)
⑦ 16位首部检验和:利用这个字段来鉴别报头是否损坏
⑧ 32位源IP地址/32位目的IP地址:发送端和接收端的IP
(2)IP报文分片
IP报文的分片与报头中的16位标识、3位标志、13位偏移有关
① 为什么分片
② 如何分片/组装
a.怎么这道一个报文被分片了?
当更多分片(3位标志中的一位) 取值为1时,表示后面还有分片
当更多分片(3位标志中的一位) 取值为0时,表示这是最后一个分片,标志着该数据报的分片结束
1) 如果更多分片(3位标志中的一位)是1,就证明该报文分片了 -> 其他片
2) 如果更多分片是0 && 13位片偏移>0 说明是分片,否则不是 -> 最后一片
b.同一个报文的分片怎么被被识别出来?
利用16位标识位 -> 同一个报文的分片的16位标识位相同
c.哪个是第一个?哪个是最后一个?有没有收全或者丢失?
第一个:更多分片=1 && 偏移量=0、最后一个:更多分片=0 && 偏移量>0
当前的起始位置 + 自身长度 = 下一个报文中填充的偏移量大小
d.哪块在前?哪块在后?如何正确的进行组装?
只要按照片偏移进行升序排序即可
e.怎么保证合并起来的报文是正确的?
利用TCP/IP中的校验和
③ 几点注意
a.分片不好,分片不是主流情况
b.一个报文被拆成了多个,任意一个分片丢失都会造成拼接失败,进而导致对端重传整个报文
c.分片会增加丢包概率(99%*99%*99% < 99%)
2.解包/分用
如何解包:利用4位首部长度 和 16位总长度
如何分用:利用8位协议