ake*_*las 4 networking memory tcp
我想我的问题已经很清楚了。我正在阅读这篇文章来了解套接字是如何工作的,它提到了术语“套接字”和“缓冲区”,它们可以互换:
\n\n假设数据包是按顺序排列的,则数据有效负载将被复制到socket\xe2\x80\x99s 接收缓冲区中。此时,内核将唤醒任何执行阻塞 read(2) 的进程,或者使用 I/O 多路复用系统调用(如 select(2) 或 epoll_wait(2))来等待套接字的进程。
\n\n这些术语的含义相同吗?如果有区别,那么套接字和缓冲区的区别是什么?
\n套接字是比缓冲区更广泛的概念。套接字有两个缓冲区和一些与其关联的其他信息。
在套接字编程的上下文中,套接字是应用程序与一个 TCP 连接(或 UDP 流)的接口。您的应用程序不会直接从网络接口卡 (NIC) 读取数据/向网络接口卡 (NIC) 写入数据,而是通过内核的网络堆栈。套接字缓冲区是内核代表您的应用程序保存的数据包的短队列,因为它在 NIC 和您的应用程序的内存空间之间传输数据。
发送缓冲区或写入缓冲区是您的应用程序已移交给网络堆栈以发送的数据包队列,而接收缓冲区或读取缓冲区是内核的网络堆栈代表您的应用程序接收的数据包队列,它正在等待您的应用程序要读取(也就是说,它存储在内核空间中,等待您的应用程序/进程要求将其复制到应用程序的内存中)。
在发送方,为了获得最佳性能,您的应用程序必须write()使用足够的数据进行足够频繁的调用,以确保内核的发送缓冲区永远不会耗尽要发送的数据。我们称之为“保持管道充满”。但为了最大限度地减少延迟,您的应用程序不应向内核的发送缓冲区加载太多数据。
在接收端,为了获得最佳性能,您的应用程序必须read()足够频繁地调用,以尝试保持内核的接收缓冲区为空。否则,如果接收缓冲区没有足够的可用空间,网络堆栈将向发送方发出信号,告知其接收缓冲区已满,从而导致发送方减慢发送数据的速率。
| 归档时间: |
|
| 查看次数: |
4956 次 |
| 最近记录: |