在TCP连接上发送数据,是否能保证接收数据的顺序与发送数据的顺序一致

cannsy 2006-02-05 11:07:49
比如,我在发送端进行了两次数据发送:send(数据1)和send(数据2),那么接收端是不是肯定先收到"数据1",我在想如果"数据2"的路由被选择了一个比"数据1"更近的路径,是不是会导致先收到"数据2"?
...全文
1577 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
yingpf 2006-02-14
  • 打赏
  • 举报
回复
如果接收端接到包的顺序不对,TCP会按数据编号重新排序.
cnwolf 2006-02-12
  • 打赏
  • 举报
回复
tcp是传输流,只要调用send的是顺序的,不存在多个线程同时调用一个socket send的情况

就可以保证发送顺序的正确性
wenzhousun 2006-02-10
  • 打赏
  • 举报
回复
TCP是可以保证的。TCP利用IP层协议,虽然IP层不可以保证先后顺序,但TCP对此做了处理,可以保证。
force2004 2006-02-09
  • 打赏
  • 举报
回复
mark
BOYGUARD110 2006-02-09
  • 打赏
  • 举报
回复
mark
3Q&2005 2006-02-09
  • 打赏
  • 举报
回复
i must go back to learn
lisypro 2006-02-09
  • 打赏
  • 举报
回复
Can't
herman~~ 2006-02-09
  • 打赏
  • 举报
回复
TCP是可靠的数据传输协议
robin_yao 2006-02-07
  • 打赏
  • 举报
回复
比如,我在发送端进行了两次数据发送:send(数据1)和send(数据2),那么接收端是不是肯定先收到"数据1",我在想如果"数据2"的路由被选择了一个比"数据1"更近的路径,是不是会导致先收到"数据2"?

不会出现你说的问题。
你先send谁,就能先recv到谁
tcp就是处理你所担心的这个问题的。
zuoluoyun 2006-02-07
  • 打赏
  • 举报
回复
可以保证,tcp是处于传输层,不管网络层如何分包,如何路由它都可以保证
fisker0303 2006-02-07
  • 打赏
  • 举报
回复
这是TCP的特性之一,当然可以保证。
Vc_Atl 2006-02-07
  • 打赏
  • 举报
回复
完全可以保证 tcp
两次发送被串行化了
itcoco 2006-02-06
  • 打赏
  • 举报
回复
学习
大家的讨论算是比较深入了 看到了很多基础的东西 其实这些以前网络基础都讲过的
nntg 2006-02-06
  • 打赏
  • 举报
回复
lz说的情况不会发生。
我的理解:
假设一个简单的情况,send两次,分别通过两个IP包发送,先数据1,后数据2。这两个IP包在整个传送过程中没有发生分片。
在发送端显然数据2 tcp段中的序列号seq大于数据1 tcp段中的序列号。假设数据2所在的IP包在数据1前到达目的主机,目的主机的tcp协议栈判断该连接的期望接收的seq小于接收到的数据2的tcp seq,于是将该数据放到目的主机对应连接的接收窗口中,此时目的主机的recv仍然保持阻塞,直到数据1到达后,该tcp seq与期望的seq相同,recv才返回。
adingzhang 2006-02-06
  • 打赏
  • 举报
回复
TCP面向连接的服务,send是基于面向连接的服务基础之上的阿,即如果是建立了TCP连接,数据传送保证接收到的数据的顺序性
newbiestar 2006-02-06
  • 打赏
  • 举报
回复
TCP哪里来什么虚电路?有电路还要TCP/IP分层干什么?
wangzhanlili 2006-02-06
  • 打赏
  • 举报
回复
完全可以保证 tcp
AVest 2006-02-06
  • 打赏
  • 举报
回复
我认为如果在一个连接会话期内
那么可以保证
如果不是 那么不能保证
newbiestar 2006-02-05
  • 打赏
  • 举报
回复
同时UNP VOL1 3e也有相关内容,摘录如下

TCP also sequences the data by associating a sequence number with every byte that it sends. For example, assume an application writes 2,048 bytes to a TCP socket, causing TCP to send two segments, the first containing the data with sequence numbers 1–1,024 and the second containing the data with sequence numbers 1,025–2,048. (A segment is the unit of data that TCP passes to IP.) If the segments arrive out of order, the receiving TCP will reorder the two segments based on their sequence numbers before passing the data to the receiving application. If TCP receives duplicate data from its peer (say the peer thought a segment was lost and retransmitted it, when it wasn't really lost, the network was just overloaded), it can detect that the data has been duplicated (from the sequence numbers), and discard the duplicate data.

sequence number是一个TCP Connection的属性,而不是一次send的属性,所以TCP完全可以确保连接的可靠性
newbiestar 2006-02-05
  • 打赏
  • 举报
回复
要权威的话去看TCP Illustrated VOL1 18章

既然T C P报文段作为I P数据报来传输,而I P数据报的到达可能会失序,因此T C P报文段
的到达也可能会失序。如果必要, T C P将对收到的数据进行重新排序,将收到的数据以
正确的顺序交给应用层。

以上为中译版相关内容
加载更多回复(13)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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