TCP/IP 协议簇的逐层封装

        在使用 TCP 协议的网络程序中,用户数据从产生到从网卡发出去一般要经过如下的逐层封装过程:


        从下往上看:
        1)链路层通过加固定长度的首部、尾部来封装 IP 数据报(Datagram) 产生以太网帧(Frame)。 其中首部存在对封装数据的标识:是 IP(0x0800,例如本例) 、ARP(0x0806) 还是 RARP(0x0835)。
        2)网络层通过加 IP首部来封装 TCP 段(Segment) 产生 IP 数据报。 其中首部存在对封装数据的标识:是 ICMP(0x01)、IGMP(0x02)、TCP(0x06,例如本例)还是 UDP(0x11)。
        3)传输层通过加首部来封装应用数据产生 TCP 段。其中TCP首部存在对封装数据的标识:端口号,来标识是那个应用程序产生的数据。

        4)按这种处理逻辑,在应用层,对于我们要处理的应用数据理所当然的加上固定长度的首部,首部中同样含有某些标识,标识些什么呢?按经验,一般会标识本次数据的业务意义,在程序中一般处理为业务集合(枚举型)的某个元素;如果是 TCP应用(本例) 还可能包括应用数据总体长度。


Ethernet、Tcp、Udp 等协议的数据包格式

        TCP/IP协议是一个比较复杂的协议集,有很多专业书籍介绍。在此,我仅介绍其与编程密切相关的部分:以太网上 TCP/IP 协议的分层结构及其报文格式。我们知道TCP/IP 协议采用分层结构,其分层模型及协议如下表:

        协议采用分层结构,因此,数据报文也采用分层封装的方法。下面以应用最广泛的以太网为例说明其数据报文分层封装,如下图所示:

        任何通讯协议都有独特的报文格式,TCP/IP 协议也不例外。对于通讯协议编程,我们首先要清楚其报文格式。由于TCP/IP 协议采用分层模型,各层都有专用的报头,以下就简单介绍以太网下 TCP/IP 各层报文格式。


        8 字节的前导用于帧同步,CRC 域用于帧校验。这些用户不必关心其由网卡芯片自动添加。目的地址和源地址是指网卡的物理地址,即 MAC 地址,具有唯一性。帧类型或协议类型是指数据包的高级协议,如 0x0806 表示 ARP 协议,0x0800 表示 IP 协议等。之所以要把数据组合成以帧为单位传送,是为了在出错时,可只将有错的帧重发,而不必将全部数据重新发送,从而提高了效率。注:数据以帧为单位进行发送,若某一帧有差错,以后就重传这个出错的帧。一个帧要有帧界限,接收端在收到比特流后,能够依据帧界限正确知道哪些比特构成一个帧。接收端找到帧定界符并确定帧的准确位置,就是完成了帧同步。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值