TCP协议的基本问题——send()和recv()会发生什么

  • 本文关键字:recv 协议 问题 send TCP tcp
  • 更新时间 :
  • 英文 :


我对TCP协议有一些基本问题

情况:Machine_A调用send(sockfd(将数据发送到Machine_B。send((调用成功。

问题:当send((调用返回时,是否意味着数据已经到达Machine_B?或者它刚刚被操作系统接受了

情况:Machine_A调用send(sockfd(将数据发送到Machine_B。但是Machine_B上的application_B从套接字读取的速度不够快。Application_A正在写入10MB/s,而Application_B正在读取1KB/s。

问题

  1. 在这种情况下,send((调用何时在Machine_A上成功?

  2. 它是在数据提交到Machine_A上的OS_A的那一刻成功,还是等待OS_B的确认?

  3. OS_B是否要求Application_B在向OS_A确认数据包之前提取数据包?

send只关心将数据放入本地套接字缓冲区,即它不会等待来自接收方机器的ACK,甚至不会等到数据由接收方应用程序处理(甚至更晚(。如果你需要这类信息,你需要一些应用程序级别的确认。此外,虽然ACK通过TCP发送,但无论如何都不会通过UDP等其他协议发送。

send只有在无法将数据放入套接字缓冲区时才会失败,可能是因为没有套接字缓冲区(套接字已关闭(,也可能是因为套接字缓冲区已满,但send被称为非阻塞。如果套接字缓冲区已满并且send被称为阻塞,则它将只是阻塞,直到套接字缓冲区中再次有空间为止。

最新更新