TCP / IP发送数据和接收数据序列

时间:2015-06-25 20:57:08

标签: c sockets tcp

我在嵌入式微控制器上使用uIP开源TCP堆栈。 我已经阅读了很多TCP / IP帖子,看起来与这个问题相似,但我仍然无法得到我想要的答案。因此我问这个。

我知道发送数据将按顺序保存在以太网控制器(服务器)Tx缓冲区中。接收数据将按顺序保存在以太网控制器(客户端)Rx缓冲区中。

如果我将100个字节的消息(使用PSOCK_SEND方法)一起发送到使用TCP的客户端。我知道如果我把所有人一起发送,接收器将保证一起收到。

现在,如果我逐个发送两个50字节,则可能首先接收发送的第二个50字节。发送的前50个字节可以第二个接收吗?

我的理解是这在HTTP协议中是可行的。但是在TCP中,无论是以两个步骤还是一个步骤发送的字节,接收都将以相同的顺序接收。 因此TCP将继续发送前50个字节,直到它成功或超时。只有这样它才会发送第二个50字节。

2 个答案:

答案 0 :(得分:4)

  

我知道如果我一起发送接收器将保证收到所有   在一起。

以上内容无法保证。 TCP是面向字节流的协议,而不是面向消息的协议,因此它不保证除了以与发送它们相同的顺序接收数据字节之外的任何其他内容。接收器可能通过单个recv()调用接收所有100个字节,或者它可能(至少原则上)在100次recv()调用中一次接收1个字节,或者介于两者之间的任何地方,并且它取决于接收代码准备好正确处理传入的数据,无论它到达的块的大小是多少。

  

现在,如果我逐个发送两个50字节,那么有可能   发送的第二个50字节可以先接收。并发送前50个字节   可以收到第二个?

就申请而言,没有。 TCP保证在应用程序级别有序接收TCP数据。 (TCP堆栈可能无序接收底层数据包,但TCP堆栈无法按顺序将它们呈现给应用程序层。相反,它会等到它以正确的顺序准备好一些数据在使recv()返回更多数据之前)

  

我的理解是这在HTTP协议中是可行的。

由于HTTP建立在TCP之上,因此对TCP的任何保证也适用于HTTP。特别是,HTTP数据将按发件人发送的顺序接收。 (您可能会对HTTP规范中的某些内容感到有些困惑,例如发送方可以按不同的顺序发送HTTP标头,但请注意,无论发送方发送的顺序是什么,接收方接收它们的顺序都是完全相同的。因为它们都是通过TCP层的字节流,这是严格的FIFO)

答案 1 :(得分:2)

  

因此TCP将继续发送前50个字节,直到成功或   超时。只有这样它才会发送第二个50字节。

很抱歉,但您对TCP工作方式的理解不正确。 TCP具有window size,它是可以在连接上发送而无需等待来自接收方的确认的字节数。

因此,例如,如果发送两个50字节的数据包,并且TCP窗口至少为100个字节,则可以在不等待响应的情况下发送数据包。并且根据网络状况,分组可以以相反的顺序到达接收器。因此,您从以太网控制器(客户端)Rx缓冲区读取的数据包必须按顺序

在将数据包有效负载传递给更高级别的协议(在您的情况下是HTTP)之前,由TCP堆栈软件根据需要重新排序数据包。由于TCP堆栈软件重新排序数据包,因此HTTP软件将始终按照发送的顺序查看字节。

回应评论:

  

我有两个对比鲜明的答案,我想澄清一下。这是   意味着,对于应用程序层,字节将按顺序排列,无论如何   TCP窗口大小? (1)就申请而言,TCP   保证在应用程序中按顺序接收TCP数据   水平。 (2)TCP有一个窗口大小:如果你发送两个50字节的数据包,和   TCP窗口至少为100字节,然后取决于网络   条件,数据包可能以相反的顺序到达接收器。

enter image description here

Statement(1)适用于TCP层和应用层之间的接口。声明(2)适用于硬件和TCP层之间的接口。这两个语句没有矛盾,因为TCP层会根据需要重新排序数据包。

相关问题