这是我参与「第三届青训营 -后端场」笔记创作活动的第五篇笔记
本篇文章是在王老师讲网络那节课课后,学习IP数据包的笔记。主要介绍IP数据包格式以及其中蕴含的网络知识。
IP数据包
第一行的字段有:
- version IP协议的版本,4或6
- Internet Header Length 定义了头部选项的长度,默认是5
- TOS 包含有一个字段 ECN,当路由器的缓冲区快要满了,ECN会启动,这样接收者就知道网络出现了拥塞,方便上层协议进行拥塞控制
- Total length 整个IP报文的长度:头部加上数据部分
第二行的三个字段的主要用途是包的分片,多数情况为了传输效率,很多情况下分片(fragmentation)会被禁用。下面简单介绍一下分片:
例如以太网的最大传输单元(MTU)是1500字节,如果IP包大小2000字节的话,有两个选择:
- 如果该包设置了不要分片,丢弃该包,通过ICMP通知该包的发送者——IP包超过了MTU的限制。
- 分片,分片会影响到包的传送效率(如果一个分片丢失,需要传输部分片段,非常难以控制),而且从安全的角度,攻击者可以伪造分片片段。 第三行字段:
- Time To Live 因为路由器不会保存IP数据包的信息,比如是否曾经到过这里,因此为了避免出现循环,设置了这么一个计数器字段,每过一个路由减一,当值为0时丢弃该包,并向源主机发送ICMP报文。
- Protocol 标识该包数据部分的协议,例如TCP或者UDP
- Checksum 头部的校验和,判断传输过程中是否出错
最后就是源主机IP和目标主机IP以及选项和数据部分。
网络中无处不在的唯一标识
在链路层,使用MAC地址来标识不同设备,数据链路层一般通过广播来传输信息,当然这会引入很多安全问题
在网络层,使用IP地址来标识不同设备,网络层完成的host与host之间的通信
在传输层,使用端口来鉴别不同的进程,传输层完成了进程间的网络通信
traceroute的工作原理
在IP头部有个字段叫做ttl(time to live),该字段是一个无符号整数,每经过一次路由ttl值减一,当ttl值为零时,路由器将丢弃报文。
该字段设计的初衷是防止报文在路由的过程中形成循环浪费资源。
报文被丢弃时路由器会向源主机发送ICMP报文,这样源主机就可以知道报文在哪个路由器被丢弃了
如果我们从1开始缓慢增加ttl的值,就可以得到中间所有路由器的ip地址,这就是traceroute的实现原理。
当然如果ICMP被关闭,那么对应的ip地址不可见,关闭ICMP会导致很多问题,常见的还有“TCP黑洞”
总结
本篇文章介绍了IP数据包的字段内容,以及traceroute的工作原理,之后还会介绍TCP数据包格式,敬请期待。