linux网络编程第二讲

来源:互联网 发布:阿里云acp认证 编辑:程序博客网 时间:2024/05/18 00:12

主机间通信之封装

上层协议是如何利用下层协议进行数据传输的呢?实际上就是通过封装实现的,应用层数据在传送到物理网络之前,是沿着协议栈自上而下进行的,数据传送时,每一层协议都将在上层协议的头部加上自己的头部(有时候也加尾部)
来实现本层的功能,这个过程就是封装。
示意图:


经过tcp封装过的报文称为TCP报文,上一篇文章中提到了tcp协议是用来维持一个连接,它会在内核中存储相关数据,这些数据的TCP头部信息和内核中的接收缓冲区或者发送缓冲区组成了TCP数据报,如图:


哎呀没发现,在听歌歌词也截图上去了,不过也希望看我博客的博友不虚此行,书归正题。
当发送端程序调用send()函数向一个TCP连接写入数据时,内核中的TCP模块首先会把数据复制到与该连接对应的TCP内核发送缓冲区中,然后利用IP模块提供的服务,传递的参数有TCP头部信息和内核发送缓冲区中的数据,相当于TCP报文段。
经过UDP封装过的数据叫做UDP数据报,它与TCP数据的封装类似,只是由于UDP建立的是不可靠的连接,它不会为应用层数据保存副本,当一个UDP数据报发送成功但是接收端没有收到时,它没有TCP的内核进行的失败重传机制,如果一个应用层想要重新发送数据,就必须从用户空间将数据重新拷贝到UDP内核发送缓冲区中。
经过IP层封装过的数据称为IP数据报(IP datagram),它同样由IP头部信息和数据部分组成,数据部分为TCP数据报、UDP数据报或者ICMP数据报。
经过数据链路层封装的数据称为帧,传输媒介不同,帧的类型也不同,我们常见的有,以太网上传输的以太网帧,令牌环网络传输的令牌环网帧,以太网帧为例,示意图:

以太网帧使用6字节的物理地址和6字节的物理地址来存放通信双方的物理地址,类型后面再说,CRC字段为帧的其他部分提供混换冗余校验,帧的最大传输单元(MTU),即帧最多能携带多少上层协议数据(比如IP数据报)通常受到网络类型的限制,上图的MTU是1500字节,如果IP数据报的大小超过了这个MTU,则可能会被分片传输。帧才是最终在物理网络上传输的字节蓄力额,到此,封装完成。

主机间通信之分用

当帧到达目的主机时,将沿着协议栈自底向上依次传递,各层协议依次处理本城负责的头部数据,以获取所需的信息,最终将处理后的帧传递给应用程序,这个过程叫做分用,分用是依靠头部信息的类型字段实现的,标准文档RFC1700中定义了所有标识上层协议类型字段和上层协议对应的数值,下面是以太网帧的分用过程:

因为IP、ARP、RARP协议都是使用帧传送数据,所以帧的头不需要提供某个字段(具体情况取决于帧的类型),这里用以太网为例,它使用2字节的类型字段来标识上层协议,如果主机接收的类型字段为0x80,则帧的数据部分为IP数据报,以太网驱动程序就将帧交付给IP模块,如果类型字段的值为0x835,则真的数据部分为RARP请求或者应答报文,以太网驱动程序就把帧交付给RARP模块,如果类型字段的值为0x806,则帧的数据部分为ARP请求或者应答报文,以太网驱动程序就把帧交付给ARP模块。
同样,因为ICMP、TCP、UDP协议都使用IP协议提供的服务,所以IP数据报的头部采用16位的协议字段来区分它们。
TCP和UDP则通过头部信息中的16位端口号字段来区分上层应用程序。比如DNS对应的端口号为53,HTTP(超文本传输协议)对应的端口为80,所有应用层协议对应的端口号都可以在etc/servers文件中找到。帧通过上述的分用过程后,最终将封装前的原始数据传送至目标服务(ARP服务、RARP服务、应用程序),在顶层服务看来,封装和分用个似乎都没有发生过。



原创粉丝点击