1.数据从应用层到数据链路层的本质
数据的封装:
- 用户在用户级缓冲区输入数据,经过应用层协议进行序列化成字节流数据,拷贝到传输层的缓冲区。
- 而操作系统在传输层维护了sk_buff这一个结构体,然后data指针指向这段数据的开头,接着再封装TCP/UDP报头,然后head指针指向报头位置。
- 当进入IP层后,此时的TCP报文即为IP层的“数据”,我们也可以在图中明显看出data指针并不是不变的,不断偏移。然后不断重复2、3间的head、data指针指向
这时我们就能够清晰的理解,除了在应用层需要拷贝到传输层,其他场景下我们都是对sk_buff指针进行偏移,然后不断向下交付,最终从网络中发送。
那么我们在另一台主机对接收到的数据报文,那么是如何从数据链路层到应用层被我们看到的呢?
数据的解包分用:
- 当我们从网络中获取到一个数据报文,我们在数据链路层通过定长的报头,将这个head指针向后偏移,就获得了相对于数据链路层的“有效载荷”,即网络层的报文
- 同理我们也是这样子不断地移动head指针来实现报头的分离,但是实际上我们进行解包时还是需要对某一层协议进行分析,来判断数据的合法性和可靠性
- 最终字节流数据到了传输层缓冲区,最后传输到应用层,借助应用层协议找到对应接收的用户级缓冲区