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 |
根據服務名找出所占用端口
[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不解析域名 |
[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 [::]:*
[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