网络总结
对TCP/IP这块挺喜欢的,认真把这方面学习了,现在总结一下
首先得从链路层说起了
链路层
首先是链路层的两种封装格式:
ieee封装和以太网封装
关于ieee封装就不过多叙述,毕竟用的很少
以太网封装格式:
源mac地址(6字节) 目的mac地址(6字节) 还有类型(2字节) 最后还有4字节的校验和(这个4字节在数据的最后面)
目的mac地址一般是网关的mac地址或路由器的mac地址,链路层的mac地址是每一跳都会变的,IP是什么时候都不变的(NAT和可选项除外)
类型在链路层和IP层都存在,为了区分下一层的协议。
试想,如果不知道下一层的协议,如何判断之后的数据呢?所以这个类型很重要
以太网的容量是46-1500(除过它本身),多了分片少了补充。比如ARP就是少于46字节的,后面就会补0
下面说说IP层
(图片来源于网络,侵删)
版本:IPV4和IPV6,但其实中间还有很多小版本(使用概率极低)
上面的图是针对IPV4的图,IPV6还请自行研究
首部长度:IP头部的长度,一个B代表15字节,4个就是60字节,所以说,这个规定限制了IP的首部长度最多为60字节
而固定部分有20字节,所以,可选项最多40字节。
区分服务:这块已经基本不用了,本来是优先级,时延,吞吐量等等。既然不用了,就不细述
总长度:是IP包的报头+IP数据段,总长度最大为65535
下面这一行主要是为IP分片准备的
标识:标识是哪个包,这个相当于一个ID号,无论怎么分片,这个ID号不会变的
标志:第一个标志bf,表示不分片,如果需要分片就丢弃此包,并回送ICMP差错报文,MTU路径探索就是基于这一原理的
下面标志是mf,表示是不是最后一片,最后一个B未使用
片偏移:这个就不多说了,通过偏移量找到位置
生存时间:本来设计的初衷是设计成时间,但是发现这样很麻烦,就改成了每经过一个路由器,TTL-1,如果为0或者1就丢弃
并返回ICMP报文,这个选项是为了防止某些报文在路由器中游荡,或者环路。当然traceroute也是根据生存时间做出来的
之后也会详细叙述
协议:和上文的以太网头的类型一样,是下一层的类型
首部校验和:和以太网的4字节一样,计算头部的校验和,如果到达对端,发现校验和不对,丢弃
下面说说IP层的几大协议
1.ARP
ARP也是一个特别大的协议,而且不安全
ARP是一个广播,在局域网下的所有主机都会收到这个包,如果发现是自己的就返回ARP应答包,否则就丢弃。
顺带提一句,ARP应答包是单播,只有ARP请求包是广播
注意,因为并不知道目的mac是多少,所以,以太网的目的mac是ff:ff:ff:ff:ff:ff
ARP包中的目的地址是00:00:00:00:00:00
ARP封包格式很简单,就不过多叙述了,而且,ARP包前面的那些东西都是固定好的,比如那个6&&4
ip封包后,要得到mac,就起查看路由表,看是不是一个网中的,若是,直接ARP得到mac地址并发送,若不是,则发送给默认网关(所以刚刚为什么说一般是路由器的mac地址)
系统一般都有优化,有一个ARP缓存,这个缓存可以在一定时间内,不用查询路由表,直接找到mac并发送。
这个ARP表在Linux系统下通过arp -a可以查看,如果本机收到别的ARP请求包,不论是不是发给自己的,这个主机都会把这个包的IP以及对应的mac缓存起来。
而且,这个表是没什么安全措施的,所以,容易被攻击,比如把别人的数据发送给你,然后通过你,引入到路由器。
这个就是代理了(iptables开启转发),但是是在别人不知道的情况下,当然,ARP攻击也是这个原理
ARP代理
当主机a想要获得www.baiidu.com的mac的时候,主机a ping www.baidu.com,这个时候网管替www.baidu.com做出应答,并给a说,我就是你想要的mac,并把自己的mac给a,这样,主机a就认为网关就是www.baidu.com,当网关收到a发给www.baidu.com的消息时,就把这个转发给百度,这就是ARP代理
https://www.cnblogs.com/flyingzl/articles/2095008.html
当然,ARP代理还有些问题,比如根部不能上网,详情请自行百度
免费ARP
免费ARP就是在主机刚刚获取IP等基本信息后,发送一个IP为自己的ARP包,看看有没有主机回复,如果有主机回复,则说明IP冲突,就要换IP,如果没有冲突,也能把自己的IP和mac缓存到其他所有主机中
一般来说,现在的IP都是DHCP服务器(小型局域网一般路由器上有这个功能,大型的网就有专门的DHCP服务器)分配的,不存在IP冲突这种问题
2.ICMP协议
ICMP协议是IP层的,但是数据是放在IP层的后面
(图片来源于网络,侵删)
ICMP协议有两种形式:
1.ICMP差错报文
2.ICMP查询报文
类型为3的都是差错报文,网上有详细的图,请自行搜索
当发送一份ICMP差错报文时,报文后始终包含IP头部和IP数据报的前8个字节
示例:TYPE 3 CODE 3表示端口不可达
然后就会在下面写上上次发送的IP和IP数据报的前8个字节
这8个字节其实是看端口的,是看是哪个端口的,看是哪个进程发的
(所以,这里可以加一句,如果不是IP分片的第一片,如果丢失或者怎样,是不会回送ICMP报文的,因为都不知道端口,回送没有意义)
以下情况不会产生差错报文:
1.ICMP差错报文,如果本来都是差错报文了,则不会产生,但是ICMP查询报文会产生差错报文
2.目的地址是广播或者多播(很多都是为了防止网络风暴)
3.不是IP分片的第一片,看上述示例
下面说说ping程序
每个主机中,其实系统都有一个ping的服务器
这个时候就要用到标识符和序号这两个东西了
Linux操作系统的实现是标识符是进程号,序号是从1开始的。选项数据里边有时间戳
当服务器收到后,会原封不动的把数据返回
并且,如果IP中有选项,比如df等等,也会原封不动的封装返回*
这个时候,就会有有意思的事情发送,比如你在这边发送过去,一直回不来,可能对方服务器已经收到了,但是因为df位为1,在发不过来,然后给对面服务器回送ICMP报文。因为MTU是单向的,客户端到服务器和服务器到客户端的MTU很可能不一样!想想一个入口,一个出口,都是看出口的,肯定不一样
Windows实现ping就比较玄学了,但是也可以,可能是程序员偷懒了吧
Windows中的标识符是一样的,序号是统一排的。并且选项数据是随机的,不是时间戳,应该在发送过去的时候,Windows这边记录的,回来的时候计算
下面就来介绍一下IP可选项
简单科普,因为大部分防火墙为了安全考虑,将TCP IP的可选项统统关闭
1.IP记录路由选项
在可选项中开启IPRR选项,这个选项可以把每一次经过的节点记录下来
Windows中ping程序的-R参数有这个功能,但是我的Linux系统没有,大家可以多测试一下
这个功能基本上已经废除了,因为首先,多出来的就40字节,而一个IPv4就4个字节,所以除过可选项本身部分,最多可以存9个IP
现在一般使用traceroute
这个东西是通过上面说的TTL实现的,Linux使用的是UDP高端口实现,Windows直接使用ICMP实现(ICMP request)
2.IP源站选路的操作机制
这个操作就比较牛了,能改变IP地址,就是一开始在可选项中放入几个地址,然后可以变换地址
其中这个选路分为严格源站和宽松源站,严格源站要保证每一跳的IP地址就是到达主机的这个,而宽松源站没有那个保证
详细的自行百度
3.时间戳
这个没看到用过,就是记录时间的
下面说说IP选路
1.先选明细策略路由
2.明细路由
3.策略默认路由
4.默认路由
还有一个注意,选路时,找的是最匹配的,比如两个IP一样,但是一个是/24,另一个是/32,那当然选/32
ICMP重定向差错也会更新主机的路由表
这个就是说,本来你走的一个路由,但是这个路由发现有更好的,就会回ICMP重定向差错
UDP
UDP报文格式
(图片来源于网络,侵删)
源端口:发送方的端口号,一般这个是由操作系统决定的
目的端口:一般就是80,443等知名端口,当然也有别的
UDP长度:最多65535
校验和:这个就是UDP头部+数据的校验和
注意:这个校验和也是首部+数据
而且,这个校验和还会计算伪首部,这个东西中有源地址,目的地址,等等,只是为计算是否真的到达目的地(IP层和以太网层也会进行计算是否到达目的地)
UDP是无连接的,正因为这个特性,UDP的传输速率快
UDP三大典型应用:
1.查询类,DNS
2.数据传输(这个一般上层会封装自定义协议,为了保证可靠传输),eg:TFTP
3.语音和视频
这里说一下IP分片
为什么要在这里说呢?因为,TCP几乎不分片,TCP有mss和MTU,几乎能保证部分片,因为分片后丢包导致重传,哪怕是丢一片,都会重传,代价是很大的,而且,重传是上层负责的,所以要避免分片
分片只在出口处,入口处不会分片,重组只在接收方。分片和重组对上层透明
其实关于UDP这块还有很多,比如不建议使用UDP广播,上层应用自定义协议(因为TCP确实有点慢)等等,感兴趣的自己了解一下
总结:先写这么多,本来准备把TCP也总结一下,但是感觉写前面的量也挺大,下次总结TCP吧~
如果有什么疑惑,欢迎留言