zoo*_*opa 34 network-programming tcp packet
什么时候TCP数据包会在应用层被分段?从应用程序发送TCP数据包时,应用程序层的收件人是否会以两个或多个数据包接收数据包?如果是,那么什么条件会导致数据包被分割.似乎数据包在到达以太网(网络层)限制为1500字节之前不会被分段.但是,这个碎片对应用层的接收者是透明的,因为网络层会在将数据包发送到下一层之前重新组合碎片,对吧?
Dav*_*vid 37
当它击中具有较低MTU然后数据包大小的网络设备时,它将被拆分.大多数以太网设备都是1500,但它通常可以更小,1492如果因为额外的路由信息,以太网通过PPPoE(DSL),如果添加第二层,如Windows Internet连接共享,则更低.拨号通常是576!
通常,您应该记住TCP不是数据包协议.它使用最低级别的数据包通过IP进行传输,但就任何TCP堆栈的接口而言,它是一种流协议,并不要求为发送或接收的物理数据包提供1:1的关系. (例如,大多数堆栈将保留消息,直到某个特定时间段到期,或者有足够的消息来最大化给定MTU的IP数据包的大小)
例如,如果您发送了两个"数据包"(两次调用发送功能),则接收程序可能只接收1个"数据包"(接收TCP堆栈可能将它们组合在一起).如果您正在通过TCP实现消息类型协议,则应在每条消息的开头(或其他一些页眉/页脚机制)中包含一个标头,以便接收方可以将TCP流拆分回单个消息,或者在消息中收到两部分,或者当收到几个消息作为块时.
dwc*_*dwc 16
碎片应该对TCP应用程序透明.请记住,TCP是一种流协议:您获得的是数据流,而不是数据包!如果您基于完整数据包的构思构建应用程序,那么除非您添加抽象层以从流中组装整个数据包然后将数据包传递到应用程序,否则您将遇到问题.
Kev*_*nko 11
这个问题假设不是真的 - TCP不会将数据包传递到其端点,而是发送一个字节流(八位字节).如果应用程序将两个字符串写入TCP,则可以在另一端将其作为一个字符串传递; 同样地,一根弦可以在另一端作为两个(或更多)弦传送.
RFC 793,第1.5节:
"通过将一定数量的八位字节打包成段,用于通过互联网系统传输,TCP能够在其用户之间的每个方向上传输连续的八位字节流."
关键词是连续的八位字节流(字节).
RFC 793,第2.8节:
"推送功能和分段边界之间没有必然的关系.任何特定分段中的数据可能是单个SEND呼叫的结果,全部或部分或多个SEND呼叫."
第2.8节的全部内容是相关的.
在应用层,有许多原因可能导致整个1500字节无法显示一个读取.内部操作系统和TCP堆栈中的各种因素可能导致应用程序在一次读取调用中获取一些字节,而另一些则在下一次调用中获取一些字节.是的,TCP堆栈必须在发送之前重新组装数据包,但这并不意味着你的应用程序将一次性完成所有这一切(它可能会在一次读取中获得它,但它并不保证得到它一次阅读).
TCP尝试保证按顺序传送字节,并在您的背后发生错误检查,自动重新发送等.可以把它想象成应用层的管道,不要陷入陷阱如何通过网络实际发送它.