TCP介绍
TCP是可靠的传输层协议,建立连接之前会经历3次握手的阶段。
- 确认机制:接受方 收到数据之后会向 发送方 回复ACK
- 重传机制:发送方 在一定时间内没有收到 接收方的ACK就会重新发送
握手目的:与端口建立连接
TCP的三次握手
10.0.0.1为客户端,10.0.0.2为服务端
1️⃣客户端向服务端发送SYN(Synchronize Sequence Numbers同步序列请求),seq=x
2️⃣服务端收到了这个请求,同意建立连接。回复syn和ack(Acknowledge character确认字符,ack(收到的seq+1)和seq(随机)
3️⃣客户端会发出一个ack表示确认收到服务端的回复。ack=收到的seq+1(确认收到对方发送的数据),seq=自己第一次发出的seq+1
四次挥手
可以看到客户端使用TCP的get方法获取http信息,服务端返回之后,客户端回复了ACK=308和seq=155
1️⃣客户端发送fin(final),ack=seq (?seq+1?),seq=X。
2️⃣服务端返回ack=X+1,seq=Y。
3️⃣服务端发送fin,ack=X+1,seq=Y。
4️⃣客户端回复ack=Y+1,seq=X+1
5️⃣结束连接
TCP状态
三次握手的5种状态
关闭,监听,syn发送,syn接收,连接
四次挥手的6种状态
状态 | 状态主体 | 状态描述 |
---|---|---|
established | 客户端/服务端 | 断开前的初始化 |
fin_wait1 | 客户端 | 发送断开fin请求后 |
close_wait | 服务端 | 收到fin并向客户端回复ack |
fin_wait2 | 客户端 | 收到服务端返回的ack,等待数据传输 |
last-ack | 服务端 | 发送断开fin请求后 |
time_wait | 客户端 | 回复syn断开请求发出ack |
closed | 客户端/服务端 | 客户端等待2msl,服务端收到ack报文 |
closeing | 客户端 | 没有收到ack,直接收到fin。 |
- 四次挥手时,发送了SYN自己就不会给对方发送数据了,但是可以接受数据。
- closeing状态具体原因案例:
- 代码问题:如果客户端调用第三方接口,如mysql,redis。调用完毕忘记关闭连接。服务器等到超时之后就会主动发送FIN报文。导致客服端出现closeing状态
CentosOS查看连接状态
ss命令选项 | 说明 |
---|---|
-a | 显示所有端口 |
-e | 更为详细的信息 |
-u | UDP端口 |
-t | TCP端口 |
-l | 显示处于监听状态的端口 |
-p | 显示调用端口的相关进程 |
-n | 不解析DNS |
shell
根据服务名找出所占用端口
[root@backup ~]# netstat -antlp|grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7891/rsync
tcp6 0 0 :::873 :::* LISTEN 7891/rsync
- lsof命令是一个查看系统进程的命令,还可以查看文件...调用情况
lsof命令选项 | 说明 |
---|---|
-nPi :22 | 查看22端口占用状态。P显示PID,n不解析域名 |
bash
[root@Centos-1 ~]# ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
ESTAB 0 36 192.168.43.71:22 192.168.43.253:15352
ESTAB 0 0 192.168.43.71:22 192.168.43.253:13281
LISTEN 0 100 [::1]:25 [::]:*
bash
[root@wzyCentos ~]# netstat -ant|grep -w 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.43.70:22 192.168.43.253:52040 ESTABLISHED
tcp 0 36 192.168.43.70:22 192.168.43.253:2862 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
3.253:2862 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN