![socket 和 buffer 意思一样吗?](https://linux22.com/image/1620237/socket%20%E5%92%8C%20buffer%20%E6%84%8F%E6%80%9D%E4%B8%80%E6%A0%B7%E5%90%97%EF%BC%9F.png)
我想我的问题很清楚。我在读这文章来了解套接字的工作原理,它交替提到了套接字和缓冲区这两个术语:
假设数据包是按顺序排列的,则数据有效载荷被复制到套接字的接收缓冲区此时,内核将唤醒任何正在执行阻塞读取(2)的进程,或正在使用 I/O 多路复用系统调用(如 select(2) 或 epoll_wait(2))在套接字上等待的进程。
这些术语的意思相同吗?如果有区别,那么套接字和缓冲区的区别是什么?
答案1
套接字是一个比缓冲区更广泛的概念。一个套接字有两个缓冲区以及与之相关的一些其他信息。
在套接字编程的上下文中,套接字是您的应用与一个 TCP 连接(或 UDP 流)的接口。您的应用不会直接从网络接口卡 (NIC) 读取/写入数据,而是通过内核的网络堆栈。套接字缓冲区是内核代表您的应用保存的短数据包队列,因为它在 NIC 和应用的内存空间之间移动数据。
A发送缓冲区或者写缓冲区是你的应用交给网络堆栈发送的数据包队列,以及接收缓冲区或者读缓冲区是内核的网络堆栈代表您的应用程序接收的数据包队列,它正在等待您的应用程序读取(也就是说,它存储在内核空间中,等待您的应用程序/进程要求将其复制到您的应用程序的内存中)。
在发送方,为了获得最佳性能,您的应用必须write()
足够频繁地调用,并且提供足够的数据,以确保内核的发送缓冲区永远不会用尽要发送的数据。我们称之为“保持管道满载”。但为了最大限度地减少延迟,您的应用不应使用太多了数据。
在接收方,为了获得最佳性能,您的应用必须read()
足够频繁地调用以尝试保持内核的接收缓冲区为空。否则,如果接收缓冲区没有足够的可用空间,网络堆栈将向发送方发出信号,告知其接收缓冲区已满,从而导致发送方降低发送数据的速度。