Unix网络编程:有关write函数
这是面试时遇到的一个问题
当使用socket进行网络编程时,调用write方法,将"abc"这一字符串进行写入操作,当程序获取到write方法的返回值时,"abc"字符串传输到了哪个位置。
解答
如下图所示,为某个进程写数据到一个TCP套接字中时发生的步骤。
书原话:内核将不从write系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字发送缓冲区。因此,从写一个TCP套接字的write调用成功返回仅仅表示我们可以重新使用原来的应用进程缓冲区,并不表明对端的TCP或应用进程已接收到数据。
解析:从这段话可以看出,wirte方法写"abc"这一字符串时,当程序得到了write()方法的返回值时,"abc"这一字符串从用户空间的缓冲区被发送到了内核空间中的套接字发送缓冲区中。
书原话:这一端的TCP提取套接字发送缓冲区的数据并把它发送给对端TCP,其过程基于TCP数据传送的所有规则。对端TCP必须确认收到的数据,伴随来自对端的ACK的不断到达,本端TCP至此才能从套接字缓冲区中丢弃已确认的数据。TCP必须为已发送的数据保留一个副本,直到它被确认为止。
书原话:每个数据链路都有一个输出队列,如果该队列已满,那么新到的分组将被丢弃,并沿协议栈向上返回一个错误:从数据链路到IP,再从IP到TCP。TCP将注意到这个错误,并在以后某个时刻重传相应的分节。应用进程并不知道这种暂时情况。