关于使用TCP协议中IP头部和TCP头部数据传输的问题

问题一:
假设使用TCP传输数据. 当应用层的数据传到传输层后,传输层会把数据封装成TCP报文段(增加TCP头部), 然后递交到网络层. 并加上IP头部. 这样的话数据就会有IP头部+TCP头部+用户数据.
而数据是以字节流的形式传输到对端的. 在传输层只对用户数据进行了编号. TCP头部和IP头部都没有编号的. 那么传到对端时,是怎样保证TCP头部和IP头部自身的的格式有序的? 对端是怎样将TCP头部和IP头部取出来的?

问题二:
对端是不是收到一个完整的报文段才将其数据递交到应用层?还是说收到该报文段一部分的数据也可以直接递交到应用层?

谢谢!
...全文
387 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
反复看了谢希仁的《计算机网络》后,问题解决了。链路层会将上层传下来的数据封装成帧,并且会加上帧检验序列。所以对端的链路层收到一帧后,会进行差错检验。

如果接收到没有差错的帧,就会将帧剥离首部和尾部,然后层层上传,最终接收缓冲区就能收到一个完整的报文段(报文段由按序排列的若干字节组成,但报文段可能不会按序到达)

如果收到有错误的帧,这时就会将其丢弃。或者这一帧在规定时间内没有到达对端,发送端后续就会超时重传。

谢谢各位。
赵4老师 2017-11-30
  • 打赏
  • 举报
回复
《TCP-IP详解卷一:协议》
heronism 2017-11-30
  • 打赏
  • 举报
回复
引用
问题是,最终不是以字节流的方式传递给对端的吗?(包括TCP头部和IP头部) 假设有2个报文段,这2个报文段都加上了IP头部和TCP头部。 那么在传输的时候, 有可能对端会先接收到第1个报文段的IP头部的前5个字节,,然后再接收到第2个报文段的IP头部的前4个字节这样。那么对端接收到的这9个字节是12345abcd这样一排的。 对端怎么知道是两个IP头部呢?
你说的这种最终按字节传输的情况应该是物理层解决的问题吧,IP层应该不用考虑这种事情。不是十分确定,感觉是这样
  • 打赏
  • 举报
回复
引用 3 楼 qq_36782456 的回复:
[quote=引用 2 楼 u012358223 的回复:] [quote=引用 1 楼 qq_36782456 的回复:] 首先IP 协议提供端对端的,在IP封装报头数据时,存在13位片偏移量,可用于将分片的数据按序组装,还可以查看数据的丢失。TCP中存在序列号,为每个封装的报文提供一个独一无二的,按序的序号,可以保证数据的完整性传输,再说,数据报总是自顶向下传输,然后自低向上解封,相对应层的所有协议都解封不了数据报时,肯定会出现错误。 还有在数据传输过程中,你怎么传输,在相应的端就怎么接受,假如你将一段数据分片组装之后传输到对面,那在对面,也会将数据组合之后形成完整数据再向上传递
首先感谢您的回复. 应该是我描述问题不清楚. 我想说的是, 假设IP头部使用了20个字节, 我将它编号为1到20. 由于最终是以字节流的形式传输的. 那对端可能会先收到1到10. 然后 又收到12到20. 11由于网络延时, 所以最后才到达. 此时的20个字节在对端已经是乱序了的. 那对端又依据什么把这20个字节有序化呢?(TCP头部也有这样的疑问)[/quote] TP头部乱序??不存在的,协议的报头是固定格式的,不会变,只有可能是段数据乱序,比如传输数据1,传输数据2...........传输数据7等;到达之后假如数据3由于网络延迟或者丢包了,相应协议都会启动退回N帧协议或者丢包重传机制,重新得到此数据报,由于每个数据报中有确定的序列号,肯定可以重新有序排列[/quote] 问题是,最终不是以字节流的方式传递给对端的吗?(包括TCP头部和IP头部) 假设有2个报文段,这2个报文段都加上了IP头部和TCP头部。 那么在传输的时候, 有可能对端会先接收到第1个报文段的IP头部的前5个字节,,然后再接收到第2个报文段的IP头部的前4个字节这样。那么对端接收到的这9个字节是12345abcd这样一排的。 对端怎么知道是两个IP头部呢?
时光若止-Dale 2017-11-29
  • 打赏
  • 举报
回复
引用 2 楼 u012358223 的回复:
[quote=引用 1 楼 qq_36782456 的回复:] 首先IP 协议提供端对端的,在IP封装报头数据时,存在13位片偏移量,可用于将分片的数据按序组装,还可以查看数据的丢失。TCP中存在序列号,为每个封装的报文提供一个独一无二的,按序的序号,可以保证数据的完整性传输,再说,数据报总是自顶向下传输,然后自低向上解封,相对应层的所有协议都解封不了数据报时,肯定会出现错误。 还有在数据传输过程中,你怎么传输,在相应的端就怎么接受,假如你将一段数据分片组装之后传输到对面,那在对面,也会将数据组合之后形成完整数据再向上传递
首先感谢您的回复. 应该是我描述问题不清楚. 我想说的是, 假设IP头部使用了20个字节, 我将它编号为1到20. 由于最终是以字节流的形式传输的. 那对端可能会先收到1到10. 然后 又收到12到20. 11由于网络延时, 所以最后才到达. 此时的20个字节在对端已经是乱序了的. 那对端又依据什么把这20个字节有序化呢?(TCP头部也有这样的疑问)[/quote] TP头部乱序??不存在的,协议的报头是固定格式的,不会变,只有可能是段数据乱序,比如传输数据1,传输数据2...........传输数据7等;到达之后假如数据3由于网络延迟或者丢包了,相应协议都会启动退回N帧协议或者丢包重传机制,重新得到此数据报,由于每个数据报中有确定的序列号,肯定可以重新有序排列
  • 打赏
  • 举报
回复
引用 1 楼 qq_36782456 的回复:
首先IP 协议提供端对端的,在IP封装报头数据时,存在13位片偏移量,可用于将分片的数据按序组装,还可以查看数据的丢失。TCP中存在序列号,为每个封装的报文提供一个独一无二的,按序的序号,可以保证数据的完整性传输,再说,数据报总是自顶向下传输,然后自低向上解封,相对应层的所有协议都解封不了数据报时,肯定会出现错误。 还有在数据传输过程中,你怎么传输,在相应的端就怎么接受,假如你将一段数据分片组装之后传输到对面,那在对面,也会将数据组合之后形成完整数据再向上传递
首先感谢您的回复. 应该是我描述问题不清楚. 我想说的是, 假设IP头部使用了20个字节, 我将它编号为1到20. 由于最终是以字节流的形式传输的. 那对端可能会先收到1到10. 然后 又收到12到20. 11由于网络延时, 所以最后才到达. 此时的20个字节在对端已经是乱序了的. 那对端又依据什么把这20个字节有序化呢?(TCP头部也有这样的疑问)
时光若止-Dale 2017-11-29
  • 打赏
  • 举报
回复
首先IP 协议提供端对端的,在IP封装报头数据时,存在13位片偏移量,可用于将分片的数据按序组装,还可以查看数据的丢失。TCP中存在序列号,为每个封装的报文提供一个独一无二的,按序的序号,可以保证数据的完整性传输,再说,数据报总是自顶向下传输,然后自低向上解封,相对应层的所有协议都解封不了数据报时,肯定会出现错误。 还有在数据传输过程中,你怎么传输,在相应的端就怎么接受,假如你将一段数据分片组装之后传输到对面,那在对面,也会将数据组合之后形成完整数据再向上传递

64,659

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧