数据链路层
1、以太网
1.1、认识以太网
主机B给主机C发送消息,现在我们已经知道根据主机C的目的IP地址来进行路由,所以网络层已经解决了为什么交给路由器F、G、H等的问题,因为根据目标网络查找路由表决定了我要走路由器F、G、H等。但是主机B怎么将数据交给路由器F,这是数据链路层的问题。
真正在网络物理结构上跑的报文是MAC帧!在逻辑上我们认为IP在流动,这是需要MAC帧的支持的。
数据链路层解决的是:相邻主机直接通信的问题。
"以太网"不是一种具体的网络,而是一种技术标准。既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等。
例如以太网中的网线必须使用双绞线。传输速率有 10M, 100M, 1000M 等。
以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网,无线LAN等。
1.2、以太网帧格式
源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
帧协议类型字段有三种值,分别对应IP、ARP、RARP。其中IP是0800,ARP是0806,RARP是8035。
帧末尾是 CRC 校验码,占4字节。
以太网帧要求有效载荷必须在[46,1500]范围内,不能超过1500,也不能少于46。
1、解包和封包的问题
读取固定长度的14字节,就可以获取目的MAC地址,源MAC地址,类型,读取最后4字节就可以获取CRC校验码,剩下的就是有效载荷了。
2、如何进行分用问题
首先进行解包,然后提取2字节的类型,根据2字节类型的值来判断,如果是0800说明要交付给上层的IP协议。
认识MAC地址:
长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突。也有些网卡支持用户配置mac地址)
1.3、MTU
认识MTU:
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节要在后面补填充位。
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
MTU对IP协议的影响:由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。
MTU对UDP协议的影响:一旦UDP携带的数据超过1472(1500 - 20(IP 首部) - 8(UDP 首部)),那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果 UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加。
由于数据链路层MTU的限制,对于较大的IP数据包要进行分片。如果不进行分片,那么数据链路层的有效载荷最大为1500,也就是IP报头+有效载荷=1500,对于网络层IP协议来说最大有效载荷就是1480,那么传输层TCP协议报头+有效载荷不能超过1480,去掉TCP报头,传输层的有效载荷最大就是1460。
这个1460就是MSS,TCP的一个数据报也不能无限大,受制于MTU。TCP 的单个数据报的最大消息长度,称为 MSS(Max Segment Size)。
如图,MTU=1500包含了IP报头和TCP报头,而我们真正要发送的数据是MSS=1460。
TCP双方三次握手的时候不仅会协商窗口大小,还会进行MSS协商。
最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
然后双方得知对方的MSS值之后,选择较小的作为最终MSS。