TCP协议栈

listen

  • 构建tcp control block(tcb)
  • 将状态置为listen

connect

int connect(fd, serveraddr, sizeof);
  • 找到fd对应的tcb
  • 发送syn包

accept

int accept(fd, clientaddr, &len);
1. while(acceptqueue == NULL) {pthread_cond_wait();}
2. *tcb = get_tcb_from(acceptqueue);
3. clientfd = get_fd_fdtable();
4. 根据tcb去找对应的clientfd

确定网络包在半连接队列的节点

  • 通过五元组(sip, dip, sport, dport, proto)
  • tcb通过五元组确定其唯一性

bind

  • socket创建一个fd

  • bind将fd与tcb (ip, port)进行绑定,但是不改变tcb状态

close

  • 大量close_wait

    • 没有及时调用close:将清理缓冲区剩余数据交给线程池,进行异步操作
  • 大量fin_wait_2状态

    • 设置TIME_WAIT超时(影响fin_wait_2等待时间),超时强制退出该状态
  • 双方同时close

    • 进入closing,双方进入TIME_WAIT状态

TCP/IP协议栈实现

拿到网络数据

  • raw socket:原始套接字

  • netmap

  • dpdk

  • 网络连接主要由VFS来解决,DPDK不能提高网络并发量