1. #include <sys/socket.h>
    2. int socket(int domain, int type, int protocol);
    3. 成功时返回文件描述符,失败时返回 -1
    4. int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    • domain: AF_INET, AF_INET6
    • type: SOCK_STREAM (TCP), SOCK_DGRAM (UDP)
    • protocol: 0, 使用默认实现

    文件描述符:

    • 0: stdin
    • 1: stdout
    • 2: stderr

    image.png

    服务器监听原理:

    1. 创建文件描述符
    2. 绑定 ip? 与 port
    3. 开始 listen
      1 0   socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
      2 +0  setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
      3 +0  bind(3, ..., ...) = 0
      4 +0  listen(3, 1) = 0
      5
      6 //TCP three-way handshake
      7 +0  < S 0:0(0) win 4000 <mss 1000>
      8 +0  > S. 0:0(0) ack 1 <...>
      9 +.1 < . 1:1(0) ack 1 win 1000
     10
     11 +0 accept(3, ..., ...) = 4
     12 +0 < P. 1:201(200) win 4000
     13 +0 > . 1:1(0) ack 201
    
    • < 向内核注入数据
    • > 期待响应后面的数据

    image.png

    第七行含义:

    1. syn 包
    2. 起始 seq
    3. 结束 seq
    4. 包长度
    5. 窗口大小
    6. mss

    image.png

    image.png