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
.
三次握手
- 客户端申请向服务端的通道
- 服务端接受了,并且向客户端申请通道
- 客户端接受了,并给出回应
这样经过三次握手,双方建立了双向通道
四次挥手
- A 请求关闭
- B 同意关闭单向通道
- B 把剩余的数据全部发送。
- B 向 A 发送关闭请求
- A 发送回应
- 主动端开的 A 在最后的回应后有个
TIME_WAIT
状态,时间为 2MSL,一个 MSL 在 30秒到1分钟。
服务端主动关闭
- 会导致
socket
释放,并且2MSL
后端口才能重用。否则会有bind
错误提示,并且在netstat
中可以看到处于TIME_WAIT
状态。 - 可以使用
setsockopt
函数,在bind
之前,可以防止bind
错误。
客户端主动关闭
没有危害,因为客户端的端口是随机分配端口号的,并且一般用的不多,够用了。