假设我在服务器上拨打了 3 次电话send
send(sock,"I",sizeof("I"),0);
send(sock,"Y",sizeof("Y"),0);
send(sock,"X",sizeof("X"),0);
在客户端,我打了 3 次电话recv
recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);
recv(sock,buf,sizeof(buf),0);
我不是网络专家:( tcp控制数据包的有序传递,这是否意味着服务器发送3次的数据将按照我发送它们的顺序到达?
是的,数据的有序交付受到控制的事实正是它的意思。TCP 保证了这一点。那些。要么所有数据都将按照它们发送的顺序传送,或者,在连接中断的情况下,远程节点将不会收到中断后的任何内容,并且
send()本地节点上的下一个后续调用将返回一个错误。在实践中,这意味着本地节点为每个发送的数据包分配一个唯一的编号,以便远程节点可以根据该编号确定数据发送的顺序,即使数据包到达时是无序的。并且为了确保没有遗漏任何东西,本地节点等待来自远程的数据已经到达的确认数据包,如果某些数据包没有收到,则本地节点将再次发送数据包。但所有这些都发生在“幕后”,使用操作系统工具,并且从程序方面几乎无法察觉。
但重要的是,从编程的角度来看,TCP 中没有“数据包”:从逻辑上讲,它表示数据的双向流,并且该数据可以一次以任意块的形式传递。那些。在上面的示例中,如果缓冲区足够大,第一个
recv()可以返回所有先前发送的所有数据,或者可以(在真空球形情况下)仅返回一个字符而没有终止零。send()'I'