MAC 头和 IP 头的细节
在任何一台机器上,当要访问另一个IP地址的时候,都会使用CIDR和子网掩码去判断目标IP地址和当前机器的IP地址是否属于同一网段。
- 如果是同一网段——如果ARP缓存中存有该机器的MAC地址,则直接将IP地址和MAC地址存入数据包中,并将数据包发给目标机器即可。
- 如果属于不同网段——需要通过网关去到达不同的网段。如果本机IP地址是192.168.13.24,那么网关往往是192.168.13.1.或者192.168.13.2。
网关和路由器
网关往往是一个路由器,是一个三层转发的设备。一个路由器往往有多个网口。其中一个网卡与原机器属于同一网段。
路由器是一台设备,他有多个网口或者网卡,分别连接多个局域网,每个网口是一个网段的网关。
静态路由——路由器配置静态规则
MAC地址是一个局域网内才有效的地址。因此,MAC 地址只要过网关,就必定会改变,因为局域网已经发生变化。
- 不改变IP地址的网关——转发网关
- 改变IP地址的网关——NAT网关——常见
动态路由算法
可以根据里有协议算法生成动态路由表。
求最短路径算法
- Bellman-Ford算法
- Dijkstra算法
距离矢量路由算法——基于Bellman-Ford算法
路由器保存一张路由表,包含多行,每行对应网络中的一个路由器。每行包含两条信息,一个是去往目标路器由的网口号,另一个是模板路由器的距离。
每过几秒,相邻的路由器之间就沟通路由表中的数据,每个路由器根据收集到的信息,不断更新到达目标路由的路径。
链路状态路由算法——基于Dijkstra算法
当一个路由器启动时,他先与邻居相互沟通,计算自己与邻居之间的距离。然后将自己与邻居的距离通过广播的方式传给整个网络的每个路由器。各个路由器都有完整的网络图,然后针对这个图,使用Dijkstra算法,找到亮点之间的最短路径。
动态路由协议
基于链路状态路由算法的 OSPF——外网路由协议
OSPF(Open Shortest Path First,开放式最短路径优先)是一个基于链路状态的路由协议。由于主要用于数据中心内部,用于理由决策,因此被称为内部网关协议。
内部网关协议的重点是找到最短路径。在一个组织内部,路径最短往往最有。如果存在多个最短路径,则着多个路径会进行负载均衡,这多个最短路径被称为等价路由。
基于距离矢量路由算法的 BGP——外网路由协议
传输层
TCP和UDP的区别
TCP是面向连接的,即在互通之前会建立连接,UDP是无连接的。
建立连接——是为了在客户端和服务器维护链接,而建立一定的数据结构来维护双方交互的状态。用这样的数据结构来保证所谓的面向连接的特性。
- TCP提供可靠交付。通过TCP链接传输的数据,无差错、不丢失、不重复、按序到达。
- UDP继承了IP包的特性,不保证不丢失,不保证按顺序到达
- TCP面向字节流,发送的时候发的是一个流,无头无尾。
- UDP基于数据报,一个一个的发,一个一个的接收。
- TCP可以有拥塞控制。如果网络不好,则会根据情况来调整发包行为。
- UDP没有拥塞控制。
- TCP是有状态的服务,会记录自己发送过什么、谁到达了、谁没到。
- UDP是无状态的服务。
UDP
UDP包头
在IP头里面有一个8位协议,里面存放该数据包是TCP协议还是UDP协议。
无论是TCP应用程序还是UDP应用程序,都要监听一个端口。操作系统通过端口来区分应用程序,因此端口不能冲突。
UDP的三个特点
- 沟通简单
- 不建立连接
- 网络拥塞也会继续发包
UDP使用的三个场景
- 需要资源少,在网络状况比较好的内网。或者对于丢包不敏感的应用。
- 广播
- 需要快速处理,可以容忍少理丢包,但是要求即使网络拥塞也有坚持发包的时候
UDP应用场景
1、网页或者APP的访问
http协议是基于TCP的。往往用户体验差。
QUIC(快速UDP互联网连接)是一种基于UDP的通信,其目的是降低网络延迟,提高用户体验。
2、流媒体协议
直播协议使用RTMP。而RTMP是基于TCP的。因为用户体验不好,很多直播应用是基于UDP实现自己的视频传输协议。
3、实时游戏
UDP是用于应对海量客户链接的策略。采用自定义的可靠UDP协议,自定义戳那个串策略,能够把丢包产生的延迟降到最低,减少网络问题对游戏性能造成的影响。
4、移动领域通信
移动流量上网的数据协议GTP-U是基于UDP的。
TCP
TCP包头
序号——为了解决乱序问题
确认序号——应答确认哪个序号之前的所有包都被接受了
状态位
- SYN——发起一个链接
- ACK——回复
- RET——重新连接
- FIN——结束链接
- URG——该数据包要紧急处理(类似于微信撤回)
TCP三次握手
在建立连接之后,发起链接的一方就会开始发送数据,如果此时对端出现故障,比如重启了,那么发起端的包就发不过去,会获得不可达的回复。
三次握手还有一个重要人物就是确定TCP包的序号问题。
序号不从1开始,是因为怕出现冲突。每个链接都有不同的序号,每个序号的其实序号随着时间变化。每4m加1,一共32位,因此4小时之后才会出现重复的序号
为什么是三次握手,两次行不行(滴滴三面被问这个了)
假定两次握手即可建立连接。那么在两个机器完成沟通之后,发起链接的一方之前发送的数据包到达了被建立链接的那一方那。连接又会被再次建立。此时,发起建立连接的一方并不知道该连接已经建立,因为那个发起建立的数据包是他过去发的。这就造成了对方的“单相思”。
TCP四次挥手
- 发起断开的一方发送FIN,并进入FIN_WAIT1状态
- 被断开的一方收到数据之后发送ACK,并进入CLOSED_WAIT状态
- 发起断开的一方收到ACK之后进入FIN_WAIT2状态
- 被断开的一方发送FIN并进入LAST_ACK状态
- 发起断开的一方收到FIN之后会回复ACK并进入TIME_WAIT状态
- 被断开的一方收到ACK之后会进入CLOSED状态
- 发起断开的一方在等待两倍MSL之后,也会进入CLOSED状态
2MSL
MSL是最大报文生存时间。他是任何报文在网络上存在的最长时间,超过这个时间,报文就会被丢弃。因为TCP报文基于IP协议,IP头里面有一个TTL域,是IP数据报所能经过的最大路由数。每经过一个路由器,TTL的值就会减一。当TTL的值为0时,该数据报会被丢弃,同时路由会发生ICMP报文通知源主机。协议规定MSL为2分钟,实际应用中常设置为30s,1分钟和2分钟等。
如果2MSL之后,发起断开的一方没有收到对方的ACK,就会发送RST数据包给对方,告知被断开的一方,发起端已经断开连接。
TCP状态机
TCP如何保证可靠传输
通过三点
- 按序传输
- 传输应答
- 超时重传
按序传输
TCP为了保证顺序性,为每一个包都设置一个ID。在建立连接时,会商定起始ID是什么,然后按照这个ID进行发送。为了保证不丢包,,对于发送的包都要进行应答,应答是应答某个ID之前的所有包,表示这个ID之前的包全都收到了,这种模式成为累计确认或者累计应答。为了记录所有发出去的包和接受的包,TCP要在发送端和接收端分别缓存记录
发送端
接收端
超时重传
TCP的重传策略是超时间隔加倍。每当遇到一次重传的时候,就会将下一次超时的时间间隔设置为先前的两倍,两次超时,就说网络了很差,不宜频繁重复发送。
快速重传
当接收方收到6,8,9之后,发现7丢失了,就会发送三个6的ACK给发送端,要求下一个发送的数据包是7.发送端接收到ACK之后,就会确认7丢了,不等超时,会立即重新发送7.
流量控制
对于包的确认中,同时会携带一个窗口大小。通过沟通滑动窗口大小来控制对端发送数据的速度。
拥塞控制
拥塞问题是通过控制拥塞窗口来控制的。在网络上,
通道的容量=带宽*往返延迟。
TCP的拥塞控制主要为了避免两种现象——包丢失和超时重传。拥塞的一种表现是丢包,需要超时重传。
慢启动
一条TCP链接开始,一次只能发送一个数据包;当收到确认之后,滑动窗口加一,一次可以发送两个数据包;当确认了这两个数据之后,cwnd加2,一次可以发送四个数据包;确认了四个数据包之后,cwnd的值加4,此时一次可以确认八个数据包。以此类推。
一旦发现丢包,cwnd就被重新设置为1,重新开启慢启动。