Linuxnetworking编程。 “(”“)幕后发生了什么?

ssize_t read(int fd, void * data, size_t count); 正好呢?

在网上的很多文章经常被写入,它试图读取或描述符fd。 那是什么意思? “它尝试”:/这样的sockets是如何devise的? 操作系统缓冲进来的消息? 或者是阅读时间关键操作? 我的意思是,如果我不及时“阅读”,是否有一些包裹丢失的可能性?

编辑:

我想了一会儿为什么这不是阻塞。 然后我想知道为什么阅读(…)有其他参数,而不是我在代码片段中看到的所有function。 最后我意识到它被读取 (…)而不是recv (…)。 不幸的是,它仍然按照我的预期工作。 而且,我们怎样才能和我们打成一片。 (不要编辑)我不得不承认德语的例子对读者有更多的影响…

Linux会缓存所有到达连接的TCP套接字的数据,默认情况下高达几兆字节。 数据到达的同时,您不必阅读。

netstat -tn将显示每个连接套接字的Recv-QSend-Q ,这是每个方向上排队的字节数。

正如Erik Ekman所回答的那样,即使您没有清楚地阅读,系统也会缓冲一些数据。

在缓冲区被越来越多的填充之后,接收者的TCP / IP实现将减少通告的接收窗口大小,导致对端发送更小的数据块,从而有效地抑制了传输。 当缓冲区已满时,窗口大小将降为零,并允许对等体不发送其他数据。 即使发生这种情况,也不会有数据丢失,因为一旦接收缓冲区被清除,对端将恢复发送数据包。

一个正确的TCP / IP实现保证没有数据被跳过丢失 – 一个连接是可靠的和正在工作,或者完全丢失,这是通过read返回-1来表示的。