什么情况下会在应用层分段TCP包?当TCP包从应用程序发送时,接收端是否会收到两个或更多的数据包?如果是这样,是什么条件导致分割数据包。看起来,除非达到以太网(网络层)1500字节的限制,否则包不会被分段。但是,分段将对应用层的接收方透明,因为网络层将在将分段重组后再将数据包发送到下一层,对吗?
什么情况下会在应用层分段TCP包?当TCP包从应用程序发送时,接收端是否会收到两个或更多的数据包?如果是这样,是什么条件导致分割数据包。看起来,除非达到以太网(网络层)1500字节的限制,否则包不会被分段。但是,分段将对应用层的接收方透明,因为网络层将在将分段重组后再将数据包发送到下一层,对吗?
当数据包的大小大于网络设备的最大传输单元(MTU)时,它会被分割。大多数以太网设备的MTU为1500,但如果该以太网通过PPPoE(DSL)协议发送,由于额外的路由信息,MTU可能会更小,比如1492,甚至更低,例如在添加了第二层网络协议(如Windows Internet Connection Sharing)时。而拨号连接通常只有576!
总的来说,你应该记住TCP不是一个数据包协议。它在最低层使用数据包进行IP传输,但就任何TCP堆栈的接口而言,它都是一个流协议,并没有提供一对一的物理数据包发送或接收的要求(例如,大多数堆栈将消息保留,直到达到一定时间或足够数量的消息才能使给定MTU的IP数据包最大化)。
例如,如果您发送两个“数据包”(调用发送函数两次),接收程序可能只收到1个“数据包”(接收TCP堆栈可能将它们合并在一起)。 如果您正在TCP上实现消息类型的协议,则应在每个消息的开头(或其他标题/尾部机制)包含一个标题,以便接收方可以将TCP流拆分回单独的消息中,无论是在接收到一部分消息时还是在一次接收多个消息时。
MSS
,这里没有提到。 - Maxim Egorushkin分段应该对TCP应用程序透明。请记住,TCP是一种流协议:您会获得数据流,而不是分组!如果您基于完整数据包的概念构建应用程序,则除非添加抽象层来从流中组装整个数据包并将数据包传递给应用程序,否则将会出现问题。