netstat 使用

netstat 可以用来查看 socket 状态。

安装

如果系统里面没有,那么 yum install net-tools -y 可以安装。

使用

  • 使用 netstat -a | less 或者 netstat -a | more 来查看。
  • 上半部分的信息是 TCP 相关,下半部分是进程间的 socket 通信。
  • 可以观察右边的 listen, established 等状态。
  • 客户端的 port 是客户端系统随机选择的,不要去太过于关注。

port 使用限制

  • 普通权限只能使用 1024 以上端口
  • root 可以使用 1024 以下的端口。

close 状态是假想状态,不存在的。

listen 的第二个参数作用

第二个参数 + 1 是 established 队列的大小,超过队列的客户端连接状态为 SYN_RCV.

三次握手

  1. 客户端申请向服务端的通道
  2. 服务端接受了,并且向客户端申请通道
  3. 客户端接受了,并给出回应

这样经过三次握手,双方建立了双向通道

四次挥手

  1. A 请求关闭
  2. B 同意关闭单向通道
  3. B 把剩余的数据全部发送。
  4. B 向 A 发送关闭请求
  5. A 发送回应
  6. 主动端开的 A 在最后的回应后有个 TIME_WAIT 状态,时间为 2MSL,一个 MSL 在 30秒到1分钟。

服务端主动关闭

  • 会导致 socket 释放,并且 2MSL 后端口才能重用。否则会有 bind 错误提示,并且在 netstat 中可以看到处于 TIME_WAIT 状态。
  • 可以使用 setsockopt 函数,在 bind 之前,可以防止 bind 错误。

客户端主动关闭

没有危害,因为客户端的端口是随机分配端口号的,并且一般用的不多,够用了。

参考

三次握手与四次挥手