• TCP补充


    TCP 相关实验TCP 相关实验

    理解 listen 的第二个参数

    对于服务器, listen 的第二个参数设置为 2, 并且不调用 accept

    test_server.cc

    1. #include "tcp_socket.hpp"
    2. int main(int argc, char* argv[]) {
    3. if (argc != 3) {
    4. printf("Usage ./test_server [ip] [port]\n");
    5. return 1;
    6. }
    7. TcpSocket sock;
    8. bool ret = sock.Bind(argv[1], atoi(argv[2]));
    9. if (!ret) {
    10. return 1;
    11. }
    12. ret = sock.Listen(2);
    13. if (!ret) {
    14. return 1;
    15. }
    16. // 客户端不进行 accept
    17. while (1) {
    18. sleep(1);
    19. }
    20. return 0; }
    test_client.cc
    1. #include "tcp_socket.hpp"
    2. int main(int argc, char* argv[]) {
    3. if (argc != 3) {
    4. printf("Usage ./test_client [ip] [port]\n");
    5. return 1;
    6. }
    7. TcpSocket sock;
    8. bool ret = sock.Connect(argv[1], atoi(argv[2]));
    9. if (ret) {
    10. printf("connect ok\n");
    11. } else {
    12. printf("connect failed\n");
    13. }
    14. while (1) {
    15. sleep(1);
    16. }
    17. return 0; }
    此时启动 3 个客户端同时连接服务器 , netstat 查看服务器状态 , 一切正常 .
    但是启动第四个客户端时 , 发现服务器对于第四个连接的状态存在问题了
    1. tcp 3 0 0.0.0.0:9090 0.0.0.0:* LISTEN
    2. 9084/./test_server
    3. tcp 0 0 127.0.0.1:9090 127.0.0.1:48178 SYN_RECV -
    4. tcp 0 0 127.0.0.1:9090 127.0.0.1:48176 ESTABLISHED -
    5. tcp 0 0 127.0.0.1:48178 127.0.0.1:9090 ESTABLISHED
    6. 9140/./test_client
    7. tcp 0 0 127.0.0.1:48174 127.0.0.1:9090 ESTABLISHED
    8. 9087/./test_client
    9. tcp 0 0 127.0.0.1:48176 127.0.0.1:9090 ESTABLISHED
    10. 9088/./test_client
    11. tcp 0 0 127.0.0.1:48172 127.0.0.1:9090 ESTABLISHED
    12. 9086/./test_client
    13. tcp 0 0 127.0.0.1:9090 127.0.0.1:48174 ESTABLISHED -
    14. tcp 0 0 127.0.0.1:9090 127.0.0.1:48172 ESTABLISHED -
    客户端状态正常 , 但是服务器端出现了 SYN_RECV 状态 , 而不是 ESTABLISHED 状态

    这是因为, Linux内核协议栈为一个tcp连接管理使用两个队列 

    1. 半链接队列(用来保存处于 SYN_SENT SYN_RECV 状态的请求)
    2. 全连接队列( accpetd 队列)(用来保存处于 established 状态,但是应用层没有调用 accept 取走的请求)
    而全连接队列的长度会受到 listen 第二个参数的影响
    全连接队列满了的时候 , 就无法继续让当前连接的状态进入 established 状态了 .
    这个队列的长度通过上述实验可知 , listen 的第二个参数 + 1
    问题:为什么要有队列,为什么队列不能太长?

     

     

  • 相关阅读:
    深入浅出-多进程编程
    【STM32】STM32Cube和HAL库使用初体验
    Canal实现Mysql和ES数据同步
    绿某科技集团股份有限公司UTS统一威胁探针信息泄露漏洞复现 CNVD-2022-50360
    selenium对接代理与seleniumwire访问开发者工具NetWork
    LeetCode链表练习(中)
    目标检测的yolov3、4、5、6总结
    SQL优化记录
    数据库调优厂商 OtterTune 宣布停止运营
    配置 4G 模块为WAN口上网
  • 原文地址:https://blog.csdn.net/qq_57283958/article/details/126207514