网站建设教程搭建,太原网站seo搜索优化,网页制作与设计表白设计,人工做流量的网站系统为每个 socket 创建了发送缓冲区和接收缓冲区#xff0c;应用程序调用 send()/write()函数发送数据的 时候#xff0c;内核把数据从应用进程拷贝 socket 的发送缓冲区中#xff1b;应用程序调用 recv()/read()函数接收数据的时候#xff0c;内核把数据从 socket 的接收… 系统为每个 socket 创建了发送缓冲区和接收缓冲区应用程序调用 send()/write()函数发送数据的 时候内核把数据从应用进程拷贝 socket 的发送缓冲区中应用程序调用 recv()/read()函数接收数据的时候内核把数据从 socket 的接收缓冲区拷贝应用进程中。 发送数据即把数据放入发送缓冲区中。 接收数据即从接收缓冲区中取数据。
查看 socket 缓存的大小的代码
int bufsize 0;
socklen_t optlen sizeof(bufsize);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, bufsize, optlen); // 获取发送缓冲区的大小。
cout send bufsize bufsize endl;
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, bufsize, optlen); // 获取接收缓冲区的大小。
cout recv bufsize bufsize endl;
演示
问题 1send()函数有可能会阻塞吗 如果自己的发送缓冲区和对端的接收缓冲区都满了会阻塞在高并发的场景有可能发生。 2向 socket 中写入数据后如果关闭了 socket对端还能接收到数据吗可以事件和数据都已经储存在接收缓存区。
Nagle 算法 在 TCP 协议中无论发送多少数据都要在数据前面加上协议头同时对方收到数据后也需要回复 ACK 表示确认。为了尽可能的利用网络带宽TCP 希望每次都能够以 MSSMaximum SegmentSize最大报文长度的数据块来发送数据。 Nagle 算法就是为了尽可能发送大块的数据避免网络中充斥着小数据块。 Nagle 算法的定义是任意时刻最多只能有一个未被确认的小段小段是指小于 MSS 的数据 块未被确认是指一个数据块发送出去后没有收到对端回复的 ACK。
举个例子发送端调用 send()函数将一个 int 型数据称之为 A 数据块写入到 socket 中A 数 据块会被马上发送到接收端接着发送端又调用 send()函数写入一个 int 型数据称之为 B 数据 块这时候A 块的 ACK 没有返回已经存在了一个未被确认的小段所以 B 块不会立即被发送而是等 A 块的 ACK 返回之后大概 40ms才发送。 TCP 协议中不仅仅有 Nagle 算法还有一个 ACK 延迟机制当接收端收到数据之后并不会马上 向发送端回复 ACK而是延迟 40ms 后再回复它希望在 40ms 内接收端会向发送端回复应答数据这样 ACK 就可以和应答数据一起发送把 ACK 捎带过去。 如果 TCP 连接的一端启用了 Nagle 算法另一端启用了 ACK 延时机制而发送的数据包又比较 小则可能会出现这样的情况发送端在等待上一个包的 ACK而接收端正好延迟了此 ACK那么这个正要被发送的包就会延迟 40ms。解决方案 开启 TCP_NODELAY 选项这个选项的作用就是禁用 Nagle 算法。
#include netinet/tcp.h // 注意要包含这个头文件。
int opt 1;
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,opt,sizeof(opt));
对时效要求很高的系统例如联机游戏、证券交易一般会禁用 Nagle 算法。