首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时会在应用层对TCP网络数据包进行分段?

何时会在应用层对TCP网络数据包进行分段?
EN

Stack Overflow用户
提问于 2009-04-16 15:49:50
回答 10查看 63.8K关注 0票数 37

何时会在应用层对TCP数据包进行分段?从应用程序发送TCP数据包时,应用层的接收方是否会收到两个或多个数据包?如果是,什么条件会导致数据包被分割。看起来,在达到以太网(在网络层) 1500字节的限制之前,数据包不会被分段。但是,该分片对于应用层的接收方是透明的,因为网络层会在将数据包发送到下一层之前重新组装分片,对吧?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-04-16 16:05:30

当它命中MTU低于数据包大小的网络设备时,它将被拆分。大多数以太网设备是1500,但它通常可以更小,例如1492,如果以太网是通过PPPoE (数字用户线路),因为额外的路由信息,如果添加第二层,如Windows Internet连接共享,甚至更低。拨号通常是576!

不过,一般来说,您应该记住,TCP不是一种数据包协议。它使用最低级别的数据包通过IP进行传输,但就任何TCP堆栈的接口而言,它都是流协议,不需要为您提供与发送或接收的物理数据包1:1的关系(例如,大多数堆栈将保留消息,直到特定时间段到期,或者存在足够的消息来最大化给定MTU的IP数据包的大小)

例如,如果您发送了两个“数据包”(调用send函数两次),则接收程序可能只接收一个“数据包”(接收TCP堆栈可能会将它们组合在一起)。如果要在TCP上实现消息类型协议,则应该在每条消息的开头包括一个头(或其他一些头/尾机制),以便接收端可以将TCP流拆分为单独的消息,无论是在消息分成两部分接收时,还是在多条消息作为块接收时。

票数 39
EN

Stack Overflow用户

发布于 2009-04-16 16:06:53

碎片对于TCP应用程序应该是透明的。请记住,TCP是一种流协议:您得到的是数据流,而不是数据包!如果您基于完整数据包的思想构建应用程序,那么您将会遇到问题,除非您添加一个抽象层来组装来自流的整个数据包,然后将这些数据包向上传递给应用程序。

票数 17
EN

Stack Overflow用户

发布于 2010-04-21 04:50:59

这个问题提出了一个不正确的假设-- TCP不向其端点传递数据包,而是发送字节流(八位字节)。如果应用程序将两个字符串写入TCP,则它可能在另一端作为一个字符串传递;同样,一个字符串可能在另一端作为两个(或更多)字符串传递。

RFC 793,第1.5节:

通过将一定数量的八位字节打包成段以便通过互联网系统传输,能够在用户之间在每个方向上传输连续的八位字节流。

关键字是八位字节的连续流(字节)。

RFC 793,第2.8节:

“推送函数和段边界之间没有必要的关系。任何特定段中的数据可能是单个发送调用的结果,全部或部分,也可能是多次发送调用的结果。”

2.8节的全部内容都是相关的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/756765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档