IP模块
之前TCP模块已经建立好了连接,接下来就要委托IP模块来发送包了。
IP模块是发送包的一个入口,真正发送、转发包的是集线器和路由器。
IP 模块就负责几件事,添加两个头部。
(1) MAC 头部:以太网用的头部,包含通过以太网的局域网将包传输至最近的路由器所需的控制信息
(2) IP 头部: 将包发往目的地所需的控制信息。目标IP等
(3) 之后将包交给网卡,将数字信号转换成光、电信号发送出去。
以太网:就是局域网。局域网之间通信使用MAC地址。而路由器之间转发需要用IP地址
包发送出去之后会首先发送到连接的集线器,集线器中有张表,其中记录了目的地址最近的路径中的最近的路由器。到达路由器后,路由器中有张IP协议的表,可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发往哪个路由器,同时需要查出下一个路由器的MAC地址改写当前的MAC头部。不断重复到达目的地。
现代路由器一般都有集线器功能
IP 的职责就是将委托的东西打包送到对方手里,或者是将对方送来的包接收下来,仅此而已
路由表
image.png目标地址和子网掩码都是 0.0.0.0,这表示默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行
IP头
image.png其中最重要的就是接收方的IP和协议号了。TCP:06、 UDP:11
IP模块也可以分片。它的分片主要是针对网络层的, 如果超过链路的MTU就需要分片,而TCP主要是在传输层对传输的数据进行分片。
MAC头
image.png以太类型表示以太包是什么协议的,可以有多种,一般是IP。
发送的时候是没有接收方的MAC地址的,需要通过ARP
来查询MAC地址。ARP是通过IP查询MAC地址的方式。是通过广播的方式在子网中发送消息。
ARP是有缓存的,避免每次都需要广播,产生多余的ARP包。并且缓存会在几分钟内删除。
image.png
为什么有ip地址还需要mac地址?
MAC地址在第二层网络链路层是用来在以太网(局域网)中传输使用的。而IP是在第三层网络层是用来不同的子网中传输的。而且MAC地址是一个物理地址(出厂唯一,不可修改),IP是一个逻辑地址(可以随意修改)。由于ip太灵活了,所以不能当成唯一寻址方式,但是mac又太死板了,如果全是mac寻址,那么换个网卡就会换个地址。所以需要两个配合。在局域网中使用“二层通信”,利用ip通过arp广播方式寻找mac地址最近的设备。而在跨子网段使用“三层通信”。
网卡
image.png网卡会把数字信号转换成电、光信号发送出去。网卡驱动从 IP 模块获取包之后,会将其复制到网卡内的缓冲区中,然后向MAC 模块发送发送包的命令,MAC 模块会将包从缓冲区中取出,并在开头加上报头
和起始帧分界符
,在末尾加上用于检测错误的帧校验序列
报头:一串固定的信号,代表开始的信号,就像音乐的前奏,接收方接受到就知道这是一个包要开始传输了
起始帧分界符:报头结束时的一串信号,相当于就是前奏和歌曲的分界,告知下一帧就是内容了
帧校验序列: 会将整个数据加头信息按照一定规则转换成一串信号就是帧校验序列,接收方接收到也会按照固定规则转换,和帧校验序列对比,看看数据有没有丢失或者错误
image.pngMAC 模块从报头开始将数字信息按每个比特转换成电信号,然后由 PHY,或者叫 MAU 的信号收发模块发送出去 。在这里,将数字信息转换为电信号的速率就是网络的传输速率,例如每秒将 10 Mbit 的数字信息转换为电信号发送出去,则速率就是10 Mbit/s,PHY(MAU)模块会将信号转换为可在网线上传输的格式,并通过网线发送出去
如果是接收方,过程刚好相反
收到的信号的开头是报头,通过报头的波形同步时钟,然后遇到起始帧分界符时开始将后面的信号转换成数字信息。这个操作和发送时是相反的,即PHY(MAU)模块先开始工作, 然后再轮到 MAC 模 块。 首 先,PHY(MAU)模块会将信号转换成通用格式并发送给 MAC 模块,MAC 模块再从头开始将信号转换为数字信息,并存放到缓冲区中。当到达信号的末尾时,还需要检查 FCS。具体来说,就是将从包开头到结尾的所有比特套用到公式中计算出 FCS,然后和包末尾的 FCS 进行对比,正常情况下两者应该是一致的,如果中途受到噪声干扰而导致波形发生紊乱,则两者的值会产生差异,这时这个包就会被当作错误包而被丢弃。
MAC模块还会去看一下 MAC 头部中接收方MAC 地址与网卡在初始化时分配给自己的 MAC 地址是否一致,不一致就丢弃,一致就将包放入缓冲区,网卡会利用中断程序告诉CPU收到一个包,CPU有空响应后就会调用网卡驱动,网卡驱动被中断处理程序调用后,会从网卡的缓冲区中取出收到的包,并通过 MAC 头部中的以太类型字段判断协议的类型。现在我们在大多数情况下都是使用 TCP/IP 协议。然后交给IP模块
IP模块第一步是检查 IP 头部,确认格式是否正确。如果格式没有问题,下一步就是
查看接收方 IP 地址。如果接收网络包的设备是一台 Windows 客户端计算机,那么服务器返回的包的接收方 IP 地址应该与客户端网卡的地址一致,检查确认之后我们就可以接收这个包了,如果接收到的包是经过分片的,那么 IP 模块会将它们还原成原始的包。接下来包会被交给 TCP 模块
TCP模块会根据 IP 头部中的接收方和发送方 IP 地址,以及 TCP 头部中的接收方和发送方端口号来查找对应的套接字,找到对应的套接字之后,就可以根据套接字中记录的通信状态,执行相应的操作了。例如,如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取;如果是建立或断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态
UDP
TCP被设计的很复杂可以保证将数据高效且可靠地发送给对方。可以实现重发。最简单的是收到全部包,其中一个有错误,全部重发,但是这样效率太低。所以有TCP的设计。但是如果包很小,几乎不会被分片。重发也是重发一个。那么使用TCP就有点大材小用了。
如果不使用 TCP,也不需要发送那些用来建立和断开连接的控制包了。此外,我们发送了数据,对方一般都会给出回复,只要将回复的数据当作接收确认就行了,也不需要专门的接收确认包了。
UDP 没有 TCP 的接收确认、窗口等机制,因此在收发数据之前也不需要交换控制信息,也就是说不需要建立和断开连接的步骤
,只要在从应用程序获取的数据前面加上 UDP 头部,然后交给 IP 进行发送就可以了。接收也很简单,只要根据 IP 头部中的接收方和发送方 IP 地址,以及 UDP 头部中的接收方和发送方端口号,找到相应的套接字并将数据交给相应的应用程序就可以了。除此之外,UDP 协议没有其他功能了。遇到错误或者丢包也一概不管。因为 UDP 只负责单纯地发送包而已,并不像TCP 一样会对包的送达状态进行监控,所以协议栈也不知道有没有发生错误。但这样并不会引发什么问题,因此出错时就收不到来自对方的回复,应用程序会注意到这个问题,并重新发送一遍数据。这样的操作本身并不复杂,也并不会增加应用程序的负担
UDP头部
image.png
域名解析、音视频一般采用UDP,因为域名解析包小,音视频需要保证不延迟,丢几帧包无所谓
网友评论