数据从应用层的应用进程到最后的网络包是怎么一步步封装的呢?TCP怎么拆分?IP怎么分片?

上图是一个整体的网络包的结构,可以看到网络包层层封装的结构
一、因此如果问一句,那数据从应用层的应用进程到最后的网络包是怎么一步步封装的呢?

:比较概括性的回答是:(为便于讨论,假设是一个web服务)

  1. 首先应用层的应用进程将http请求报文下发到运输层
  2. 运输层的TCP协议栈给http请求报文添加TCP头部封装成TCP报文段,然后下发到网络层
  3. 网络层的IP协议栈给TCP报文段添加上IP头部封装成IP包,然后下发到数据链路层
  4. 数据链路层也有各种协议,假设是以太网协议,那么会给IP包加上帧头和帧尾,形成,然后下发到物理层
  5. 物理层则将视为字节流,完全转化为相应的物理信号(电信号或光信号等),在线缆、光纤等媒介中传播
二、进一步提问:那运输层收到应用层下发的数据后,TCP协议是怎么看待以及怎么打包封装的?什么时候会拆分?
  1. TCP视应用层下发的http请求报文为字节流,TCP协议会根据规定的MSS(最大报文长度:规定了TCP报文所能携带的数据载荷的大小)判断是否进行拆分

  2. 如果字节流长度大于MSS,则需要进行拆分,拆分成合理的几块,然后为每一块添加上合适的TCP头部

  3. TCP头部中的序号字段就是为此服务的,最终形成一个个TCP报文段,接收方对应的运输层收到这些TCP报文段后可以根据TCP头部信息进行组装还原原来的http请求报文

三、再进一步提问:那网络层收到运输层下发的TCP报文段后,IP协议是怎么看待以及怎么打包封装的?什么时候会拆分?
  1. IP协议会根据输出端口(其实也就是被链路层的各种协议类型所规定)的MTU(最大传输单元:它规定了IP网络包的最大长度包括首部和数据载荷)进行判断是否进行分片;例如以太网的MTU=1500字节

  2. 若TCP报文段小于MTU 减 IP头部长度,则IP不需要对TCP报文段分片

  3. 若TCP报文段大于MTU 减 IP头部长度,则IP需要对TCP报文段分片

  • 分片是IP对整个TCP报文段一视同仁,也就是不会区分是TCP头部还是数据载荷,如下图所示

  • IP头部字段中的标识标志片偏移字段就是为此服务的

  • 接收端的网络层收到这些分片过的IP数据报,会根据IP头部中的字段信息,对分片进行组装,还原TCP报文段后交给上层也即运输层

    注意:

  • IP分片:是在TCP拆分后又进行了一次拆分;在接收端刚好相反,先IP组装分片,然后交给运输层TCP,之后再组装TCP数据报文段,最后交给应用层的应用进程

  • TCP拆分:依据是MSS(最大报文段长度)

  • IP分片:依据是各种转发端口的MTU(最大传输单元)


补充:

在这里插入图片描述

  • 以太网帧的最大数据帧长度为1518字节
  • 帧头包含目标MAC地址(6个字节)、源MAC地址(6个字节)、上层协议类型(2个字节)共14字节
  • 帧尾是FCS校验位(4个字节)
  • 故以太网帧的MTU = 1518 - 14 - 4 = 1500 字节
  • 又因为IP头部最小为20字节,TCP头部最小为20字节,以及在实际的应用中,通常TCP会加一个12字节的时间戳,这些共计52字节
  • 所以单个TCP每次能打包的最大数据量为MTU - 52 = 1448字节

如果本文对您有用,可以点赞、收藏本文哦,下次用到时就好找多了
如果能关注作者就太好了,作者将持续学习,持续输出,持续分享!谢谢鼓励!

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡与乌龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值