socket 连接
三次握手
各个 socket 函数
-
connect 函数:
- 调用 connect 将发起第一次握手,阻塞套接字 connect 会在第二次握完成时返回成功
- connect 失败的套接字不可再用,必须关闭
- 常见返回错误:
- ETIMEOUT:超时没有收到对端的 SYN 分节响应
- ECONNERFUSED:对端没有监听该端口(收到对端发送的 RST 分节)
-
bind 函数:
- 没有 bind 的套接字调用 connect 或 listen 时,内核会为套接字选择一个临时端口
- 常见返回错误:
- EADDRINUSE:绑定正在使用的端口(如处于 TIME_WAIT 状态下的端口或还有连接的端口,通常使用设置套接字 SO_RESUEADDR 选项来解决)
-
listen 函数:
- listen 函数的作用是将一个未建立连接的套接字从主动套接字转换为被动套接字
- 内核会为监听套接字维护(1)未完成连接队列和(2)已完成连接队列,未完成队列中连接的存留时间为一个 RTT
- backlog 参数:已连接队列的最大容量
- 连接队列已满的情况下接受到新的 SYN 分节,TCP 的处理是不予理会
- 常见错误:
- EBADF:参数 fd 非法
-
accept 函数:
- accept 用于从已完成连接队列返回下一个已完成连接(不论是处理 ESTABLISHED 状态还是 CLOSE_WAIT 状态),若队列为空则被阻塞(对于阻塞套接字)
- 常见返回错误:
- EINVAL:表示第一个参数不是监听套接字
- EMFILE:当前进程打开文件描述符已达上限