日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么理解TCP三次握手和四次揮手

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2026-04-10 16:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言:TCP 是運(yùn)維的基石

作為運(yùn)維工程師,無(wú)論是排查網(wǎng)絡(luò)故障、分析日志,還是配置負(fù)載均衡器,都需要對(duì) TCP 協(xié)議有深入理解。很多"疑難雜癥"的根源,往往在于對(duì) TCP 狀態(tài)轉(zhuǎn)換和連接管理理解不夠透徹。

本文從 TCP 協(xié)議頭部開(kāi)始,詳細(xì)講解三次握手和四次揮手的每個(gè)細(xì)節(jié),配合 Wireshark 抓包分析,幫助初中級(jí)運(yùn)維工程師建立完整的 TCP 知識(shí)體系。

前置知識(shí):OSI 七層模型基礎(chǔ)、IP 基礎(chǔ)概念

實(shí)驗(yàn)環(huán)境Linux 系統(tǒng)、Wireshark、tcpdump

1 TCP 協(xié)議頭部解析

1.1 TCP 頭部結(jié)構(gòu)

0          1          2          3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Source Port     |    Destination Port   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Sequence Number            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Acknowledgment Number           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data |    |C|E|U|A|P|R|S|F|                |
| Offset| Flags |W|C|R|C|S|S|Y|I|      Window       |
|    |    |R|E|G|K|H|T|N|N|                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Checksum      |     Urgent Pointer    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Options and Padding            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               Data               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

1.2 各字段詳解

# 使用 tcpdump 查看 TCP 頭部
# 捕獲 SYN 包
sudo tcpdump -i eth0'tcp[tcpflags] == tcp-syn'-c 5 -v

# 輸出解析
# IP (tos 0x0, ttl 64, id 0, proto TCP (6), length 60)
#   192.168.1.100.45678 > 93.184.216.34.80: Flags [S], seq 0:0, win 65535
#            ^^^^ 源端口     ^^^^ 目標(biāo)端口 ^^^^ SYN 標(biāo)志

關(guān)鍵字段說(shuō)明

字段 長(zhǎng)度 作用
Source Port 16bit 客戶(hù)端隨機(jī)選擇的端口
Destination Port 16bit 服務(wù)端監(jiān)聽(tīng)端口
Sequence Number 32bit 數(shù)據(jù)字節(jié)流編號(hào)
Acknowledgment Number 32bit 期望收到的下一個(gè)字節(jié)編號(hào)
Data Offset 4bit TCP 頭部長(zhǎng)度(4字節(jié)為單位)
Flags 9bit 控制標(biāo)志
Window 16bit 滑動(dòng)窗口大小
Checksum 16bit 頭部+數(shù)據(jù)校驗(yàn)和
Urgent Pointer 16bit 緊急數(shù)據(jù)指針

1.3 TCP 標(biāo)志位詳解

# TCP 標(biāo)志位(9個(gè))
# - URG: 緊急指針有效
# - ACK: 確認(rèn)號(hào)有效
# - PSH: 推送數(shù)據(jù)給應(yīng)用層
# - RST: 重置連接
# - SYN: 同步序號(hào)(建立連接)
# - FIN: 結(jié)束連接
# - ECE: ECN 顯式擁塞通知
# - CWR: 擁塞窗口減小
# - NS: 保留(Nonce Sum)

# tcpdump 顯示標(biāo)志位組合
# [S]   = SYN
# [S.]   = SYN + ACK
# [.]   = ACK
# [F]   = FIN
# [F.]   = FIN + ACK
# [R]   = RST
# [R.]   = RST + ACK
# [P.]   = PSH + ACK
# [S.] [.] [R] = 三次握手序列

# 捕獲所有帶 RST 標(biāo)志的包
sudo tcpdump -i eth0'tcp[tcpflags] & tcp-rst != 0'-n

# 捕獲帶 PSH+ACK 的數(shù)據(jù)包
sudo tcpdump -i eth0'tcp[tcpflags] == tcp-ack and tcp[tcpflags] & tcp-psh != 0'-n

1.4 序列號(hào)與確認(rèn)號(hào)機(jī)制

# TCP 序列號(hào)計(jì)算示例
classTCPSeqAck:
 def__init__(self, isn):
   # ISN: Initial Sequence Number,初始序列號(hào)
    self.isn = isn
    self.next_expected = isn +1

 defsend_data(self, data):
   """發(fā)送數(shù)據(jù),返回序列號(hào)"""
    seq = self.next_expected
    self.next_expected += len(data)
   returnseq

 defreceive_ack(self, ack):
   """收到 ACK,計(jì)算確認(rèn)號(hào)"""
   ifack > self.next_expected:
     # 確認(rèn)號(hào)大于期望,可能是重復(fù) ACK 或數(shù)據(jù)丟失
     return"ACK is larger than expected"
   elifack == self.next_expected:
     return"Full ACK - all data received"
   else:
     return"Partial ACK"

# 示例
tcp = TCPSeqAck(isn=1000)
seq1 = tcp.send_data(b"Hello") # seq=1000, 發(fā)送 "Hello" (5 bytes)
print(f"發(fā)送數(shù)據(jù),序列號(hào):{seq1}, 下一個(gè)期望:{tcp.next_expected}")

# 對(duì)方返回 ACK
result = tcp.receive_ack(1005) # 確認(rèn)號(hào) 1005
print(f"收到 ACK 1005:{result}")

2 三次握手深度解析

2.1 為什么需要三次握手?

客戶(hù)端                  服務(wù)端
 |                    |
 | 問(wèn)題:客戶(hù)端發(fā)出的 SYN 可能在網(wǎng)絡(luò)中滯留  |
 |                    |
 | 滯留的舊 SYN 到達(dá)服務(wù)端         |
 | --> 服務(wù)端 認(rèn)為是新連接請(qǐng)求       |
 | --> 服務(wù)端 分配資源等待客戶(hù)端響應(yīng)    |
 | --> 但客戶(hù)端 早已關(guān)閉連接        |
 |                    |
 | 解決方案:第三次握手讓客戶(hù)端確認(rèn)     |
 | --> 客戶(hù)端 收到 SYN+ACK        |
 | --> 客戶(hù)端 檢查序列號(hào)是否是自己發(fā)出的  |
 | --> 確認(rèn)后才發(fā)送 ACK          |
 |                    |
 | 如果是舊 SYN,客戶(hù)端會(huì)發(fā)送 RST     |
 |                    |

三次握手核心目的

驗(yàn)證雙方發(fā)送和接收能力正常

協(xié)商初始序列號(hào)(ISN)

防止舊連接請(qǐng)求干擾新連接

2.2 三次握手詳細(xì)過(guò)程

時(shí)間線      客戶(hù)端               服務(wù)端
 |                    |
 | 1. CLOSED              | 1. LISTEN
 |                    |
 | --> 選擇客戶(hù)端 ISN (c_isn)      |
 | --> 發(fā)送 SYN            |
T1 |------------------------------------>|
 |   SEQ=c_isn            |
 |   Flags=[SYN]           |
 |   狀態(tài): SYN_SENT          |
 |                    |
 |             2. 收到 SYN |
 |             --> 選擇服務(wù)端 ISN (s_isn)
 |             --> 發(fā)送 SYN+ACK
T2 |<------------------------------------|
? ?| ? ? SEQ=s_isn ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ACK=c_isn+1 ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? Flags=[SYN,ACK] ? ? ? ? ? ? ? ? ?|
? ?| ? ? 狀態(tài): SYN_RECEIVED ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
? ?| ?3. 收到 SYN+ACK ? ? ? ? ? ? ? ? ? ? ?|
? ?| ?--> 驗(yàn)證 ACK 是否正確         |
 | --> 發(fā)送 ACK            |
T3 |------------------------------------>|
 |   SEQ=c_isn+1           |
 |   ACK=s_isn+1           |
 |   Flags=[ACK]           |
 |   狀態(tài): ESTABLISHED         |
 |                    |
 |             4. 收到 ACK |
 |             --> 驗(yàn)證 ACK |
 |             --> 狀態(tài): ESTABLISHED
 |                    |
 | 雙向通信建立完成           |
 |                    |

2.3 Wireshark 三次握手實(shí)戰(zhàn)

# 捕獲 HTTP 握手包
sudo tcpdump -i eth0'tcp port 80 and tcp[tcpflags] & tcp-syn != 0'-w /tmp/handshake.pcap

# 在另一個(gè)終端發(fā)起請(qǐng)求
curl -I http://example.com

# 停止捕獲,用 Wireshark 分析
wireshark /tmp/handshake.pcap &
# 或用 tshark 命令行分析
tshark -r /tmp/handshake.pcap -Y"tcp.flags.syn==1 or tcp.flags.synack==1 or tcp.flags.ack==1"

Wireshark 抓包結(jié)果解析

Frame 1: 62 bytes on wire, 62 bytes captured
Ethernet, Src: VMware_xxxx, Dst: Intel_xxxx
Internet Protocol Version 4, Src: 192.168.1.100, Dst: 93.184.216.34
Transmission Control Protocol, Src Port: 45678, Dst Port: 80
  Source Port: 45678
  Destination Port: 80
  [Stream index: 0]
  Sequence number: 0  (relative sequence number)
  Acknowledgment number: 0
  0110 .... = Header Length: 32 bytes (8)
  Flags: 0x002 (SYN)
  Window size value: 65535
  Checksum: 0xabcd [unverified]
  Options: (12 bytes)
    Maximum segment size: 1460 bytes
    WS: 7
    No-Operation (NOP)
    No-Operation (NOP)
    Timestamps: TSval 1234567890, TSecr 0
    No-Operation (NOP)
    No-Operation (NOP)
    SackOK: sack permits

Frame 2: 62 bytes
TCP Flags: 0x012 (SYN, ACK)
Sequence number: 0 (relative sequence number)
Acknowledgment number: 1 (relative ack number)
Options: (12 bytes)
  Maximum segment size: 1460 bytes
  Timestamps: TSval 987654321, TSecr 1234567890
  ...

2.4 ISN 隨機(jī)化與安全性

# ISN (Initial Sequence Number) 隨機(jī)化原理
# RFC 793 定義:ISN = M + F(localip, localport, remoteip, remoteport, secret)
# F 是一個(gè)哈希函數(shù),產(chǎn)生 32 位隨機(jī)值

# 查看系統(tǒng) ISN 生成策略
cat /proc/sys/net/ipv4/tcp_syncookies
# 1 = 啟用 SYN Cookie

# 查看當(dāng)前連接的 ISN
ss -ti
# State   Recv-Q Send-Q  Local Address:Port  Peer Address:Port Process
# ESTAB   0    0    192.168.1.100:45678 93.184.216.34:80
#      ts sack reno wscale:7,7  --> TS val 1234567890 ecr 0

# ISN 預(yù)測(cè)攻擊演示(不要在生產(chǎn)環(huán)境操作)
# ISN 應(yīng)該每次都隨機(jī),防止攻擊者預(yù)測(cè)下一個(gè) ISN

2.5 三次握手異常場(chǎng)景

# 場(chǎng)景 1:SYN 泛洪攻擊
# 攻擊者發(fā)送大量 SYN,但不完成第三次握手
# 服務(wù)端資源被耗盡

# 防御措施
# 查看 SYN Flood 狀態(tài)
netstat -an | grep SYN_RECV | wc -l

# 啟用 SYN Cookie
echo1 > /proc/sys/net/ipv4/tcp_syncookies

# 調(diào)整 SYN Backlog
echo2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo1 > /proc/sys/net/ipv4/tcp_synack_retries

# 場(chǎng)景 2:連接超時(shí)
# 網(wǎng)絡(luò)延遲過(guò)大導(dǎo)致握手超時(shí)
ss -o state syn-sent
# Timer:(connect timeout)

# 場(chǎng)景 3:端口未監(jiān)聽(tīng)
# 發(fā)送 SYN 后收到 RST
# 目的端口沒(méi)有進(jìn)程監(jiān)聽(tīng)

# tcpdump 觀察
sudo tcpdump -i eth0'tcp[tcpflags] & tcp-rst != 0'-n

3 四次揮手深度解析

3.1 為什么是四次揮手?

客戶(hù)端                  服務(wù)端
 |                    |
 | 關(guān)閉連接的原因:            |
 | 1. TCP 是全雙工(bidirectional)    |
 | 2. 雙方各自獨(dú)立關(guān)閉發(fā)送通道       |
 | 3. 每一方都需要發(fā)送 FIN 并收到 ACK  |
 |                    |
 | 為什么揮手需要 4 個(gè)包?         |
 |                    |
 | 主動(dòng)關(guān)閉方 --> FIN --> 被動(dòng)關(guān)閉方    | (關(guān)閉發(fā)送通道)
 | 被動(dòng)關(guān)閉方 --> ACK --> 主動(dòng)關(guān)閉方   |
 |                    |
 | 被動(dòng)關(guān)閉方 --> FIN --> 主動(dòng)關(guān)閉方    | (對(duì)方也關(guān)閉發(fā)送通道)
 | 主動(dòng)關(guān)閉方 --> ACK --> 被動(dòng)關(guān)閉方    |
 |                    |

關(guān)鍵點(diǎn)

主動(dòng)關(guān)閉方發(fā)送 FIN,表示"我不會(huì)再發(fā)送數(shù)據(jù)了"

被動(dòng)關(guān)閉方收到 FIN 后返回 ACK,但此時(shí)可能仍有數(shù)據(jù)要發(fā)送

被動(dòng)關(guān)閉方數(shù)據(jù)發(fā)送完畢后,才發(fā)送自己的 FIN

TIME_WAIT 狀態(tài)確保最后的 ACK 能到達(dá)對(duì)方

3.2 四次揮手詳細(xì)過(guò)程

時(shí)間線      客戶(hù)端               服務(wù)端
 |                    |
 | 假設(shè)當(dāng)前狀態(tài): ESTABLISHED       |
 |                    |
 | 客戶(hù)端應(yīng)用進(jìn)程調(diào)用 close()      |
 | --> 發(fā)送 FIN,進(jìn)入 FIN_WAIT_1     |
T1 |------------------------------------>|
 |   SEQ=1000, ACK=2000         |
 |   Flags=[FIN,ACK]          |
 |   狀態(tài): FIN_WAIT_1          |
 |                    |
 |             2. 收到 FIN  |
 |             --> 發(fā)送 ACK |
T2 |<------------------------------------|
? ?| ? ? SEQ=2000, ACK=1001 ? ? ? ? ? ? ? ? |
? ?| ? ? Flags=[ACK] ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? 狀態(tài): CLOSE_WAIT ? ? ? ? ? ? ? ? ? |
? ?| ? ? (服務(wù)端等待應(yīng)用進(jìn)程處理完數(shù)據(jù)) ? ? ? ?|
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
? ?| ?3. 收到 ACK ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ?--> 進(jìn)入 FIN_WAIT_2          |
 | 狀態(tài): FIN_WAIT_2           |
 | (等待服務(wù)端的 FIN)          |
 |                    |
 |             4. 應(yīng)用進(jìn)程  |
 |               處理完數(shù)據(jù) |
 |             --> 調(diào)用 close|
 |             --> 發(fā)送 FIN |
T3 |<------------------------------------|
? ?| ? ? SEQ=2000, ACK=1001 ? ? ? ? ? ? ? ? |
? ?| ? ? Flags=[FIN,ACK] ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? 狀態(tài): LAST_ACK ? ? ? ? ? ? ? ? ? ? |
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
? ?| ?5. 收到 FIN ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ?--> 發(fā)送 ACK             |
T4 |------------------------------------>|
 |   SEQ=1001, ACK=2001         |
 |   Flags=[ACK]            |
 |   狀態(tài): TIME_WAIT          |
 |                    |
 | 6. 等待 2MSL 后           |
 | --> 進(jìn)入 CLOSED            |
 |                    |
 |             7. 收到 ACK |
 |             --> 進(jìn)入 CLOSED|
 |                    |

3.3 TIME_WAIT 狀態(tài)詳解

# TIME_WAIT 的作用
# 1. 確保最后的 ACK 能到達(dá)對(duì)方
#  - ACK 可能丟失
#  - 服務(wù)端 會(huì)重發(fā) FIN
#  - 如果客戶(hù)端已關(guān)閉,服務(wù)端無(wú)法收到 ACK

# 2. 等待網(wǎng)絡(luò)中所有舊數(shù)據(jù)包消散
#  - 防止延遲的舊數(shù)據(jù)包被新連接誤收
#  - MSL (Maximum Segment Lifetime) = 2分鐘

# 查看 TIME_WAIT 連接數(shù)
netstat -an | grep TIME_WAIT | wc -l

# 查看各狀態(tài)連接數(shù)
ss -s
# Total: 256 (kernel 512)
# TCP:  6 (kernel 6)
# ...

# TIME_WAIT 超時(shí)時(shí)間
# Linux 默認(rèn) 60 秒(2MSL,通常 MSL=30秒)
cat /proc/sys/net/ipv4/tcp_fin_timeout
# 輸出:60

# 調(diào)整 TIME_WAIT 超時(shí)(謹(jǐn)慎)
echo30 > /proc/sys/net/ipv4/tcp_fin_timeout

# 啟用 TIME_WAIT 復(fù)用
echo1 > /proc/sys/net/ipv4/tcp_tw_reuse

# 啟用快速回收(慎用,可能導(dǎo)致問(wèn)題)
echo1 > /proc/sys/net/ipv4/tcp_tw_recycle

3.4 CLOSE_WAIT 狀態(tài)問(wèn)題

# CLOSE_WAIT 問(wèn)題的原因
# 服務(wù)端收到客戶(hù)端 FIN 后返回 ACK
# 但服務(wù)端的應(yīng)用程序沒(méi)有調(diào)用 close()
# 導(dǎo)致連接一直處于 CLOSE_WAIT 狀態(tài)

# 排查 CLOSE_WAIT
netstat -an | grep CLOSE_WAIT | head -20
# 輸出示例:
# Proto Recv-Q Send-Q Local Address     Foreign Address    State
# tcp    0   0 0.0.0.0:3306     192.168.1.100:45678  CLOSE_WAIT

# 定位問(wèn)題進(jìn)程
ss -tlnp | grep :3306
# 查看哪些進(jìn)程持有連接

# 示例:Python 應(yīng)用程序未關(guān)閉連接
python3 <

3.5 四次揮手異常場(chǎng)景

# 場(chǎng)景 1:RST 強(qiáng)制關(guān)閉
# 一方發(fā)送 RST,另一方立即關(guān)閉

# 觸發(fā) RST 的情況
# - 訪問(wèn)不存在的連接(如服務(wù)器崩潰后重啟)
# - SO_LINGER 設(shè)置為 0
# - 故意abort連接

# 查看 RST 包
sudo tcpdump -i eth0'tcp[tcpflags] & tcp-rst != 0'-n

# 場(chǎng)景 2:FIN_WAIT_2 超時(shí)
# 客戶(hù)端進(jìn)入 FIN_WAIT_2,但服務(wù)端不發(fā)送 FIN
# 默認(rèn) 60 秒后自動(dòng)關(guān)閉

# 場(chǎng)景 3:大量 TIME_WAIT
# 高并發(fā)短連接場(chǎng)景
# 解決方案:
# 1. 調(diào)整 tcp_fin_timeout
# 2. 啟用 tcp_tw_reuse
# 3. 使用 SO_LINGER
# 4. 客戶(hù)端使用 HTTP Keep-Alive

# 場(chǎng)景 4:LAST_ACK 狀態(tài)長(zhǎng)時(shí)間存在
# 服務(wù)端發(fā)送 FIN 后未收到 ACK
# 可能網(wǎng)絡(luò)問(wèn)題或?qū)Χ吮罎?

4 TCP 狀態(tài)轉(zhuǎn)換圖

4.1 完整狀態(tài)轉(zhuǎn)換圖

             應(yīng)用層調(diào)用
               |
               v
            +-----------+
            | CLOSED |
            +-----------+
               |
               | 被動(dòng)打開(kāi) (listen)
               v
            +-----------+
     +----------->|  LISTEN |<-----------+
? ? ? ? ? | ? ? ? ? ? ?+-----------+ ? ? ? ? ? ?|
? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?|
? ? ? ? ? | 主動(dòng)發(fā)送 SYN ? ? | ? ? ? ? ? ? ? ? ?| 收到 SYN
? ? ? ? ? | ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?| 發(fā)送 SYN+ACK
? ? ? ? ? v ? ? ? ? ? ? ? ? ?v ? ? ? ? ? ? ? ? ?|
? ? +-----------+ ? ? ?+-----------+ ? ? ? ? ? ?|
? ? | SYN_SENT ?| ? ? ?| ?SYN_RCVD |<-----------+
? ? +-----------+ ? ? ?+-----------+ ? ? 收到 ACK
? ? ? ? ? | ? ? ? ? ? ? ? ? ?|
? ? ? ? ? | ? ? ? ? ? ? ? ? ?|
? ? ? ? ? | 收到 SYN+ACK ? ? | 收到 ACK
? ? ? ? ? | ? ? ? ? ? ? ? ? ?|
? ? ? ? ? v ? ? ? ? ? ? ? ? ?v
? ? +---------------------------+
? ? | ? ? ?ESTABLISHED ? ? ? ? ?|
? ? | ? ? ?(數(shù)據(jù)傳輸狀態(tài)) ? ? ? ? |
? ? +---------------------------+
? ? ? ? ? | ? ? ? ? ? ? ? ? ?^
? ? ? ? ? | ? ? ? ? ? ? ? ? ?|
? ? ? ? ? | 主動(dòng) close ? ? ? | 被動(dòng) close
? ? ? ? ? | 發(fā)送 FIN ? ? ? ? | 收到 FIN
? ? ? ? ? v ? ? ? ? ? ? ? ? ?|
? ? +-----------+ ? ? ? ? ? ?|
? ? |FIN_WAIT_1 | ? ? ? ? ? ?|
? ? +-----------+ ? ? ? ? ? ?|
? ? ? ? ? | ? ? ? ? ? ? ? ? ?|
? ? ? ? ? | 收到 ACK ? ? ? ?| 收到 FIN
? ? ? ? ? | (半關(guān)閉) ? ? ? ?| 發(fā)送 ACK
? ? ? ? ? v ? ? ? ? ? ? ? ? ?|
? ? +-----------+ ? ? ? ? ? ?|
? ? |FIN_WAIT_2 |<-----------+
? ? +-----------+ ? ? 收到 ACK
? ? ? ? ? |
? ? ? ? ? | 收到 FIN
? ? ? ? ? | 發(fā)送 ACK
? ? ? ? ? v
? ? +-----------+
? ? |TIME_WAIT ?|
? ? +-----------+
? ? ? ? ? |
? ? ? ? ? | 2MSL 超時(shí)
? ? ? ? ? v
? ? +-----------+
? ? | ?CLOSED ? |
? ? +-----------+

服務(wù)端狀態(tài):
LISTEN -> SYN_RCVD -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

客戶(hù)端狀態(tài):
CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

4.2 狀態(tài)查看命令

# 查看所有 TCP 狀態(tài)
ss -ant

# 各狀態(tài)含義
# LISTEN: 監(jiān)聽(tīng)中
# SYN_SENT: 客戶(hù)端已發(fā)送 SYN
# SYN_RECEIVED: 服務(wù)端收到 SYN
# ESTABLISHED: 連接已建立
# FIN_WAIT_1: 主動(dòng)關(guān)閉,已發(fā)送 FIN
# FIN_WAIT_2: 收到 ACK,等待對(duì)方 FIN
# CLOSE_WAIT: 被動(dòng)關(guān)閉,收到 FIN,等待應(yīng)用關(guān)閉
# CLOSING: 雙方同時(shí)關(guān)閉
# LAST_ACK: 最后確認(rèn)狀態(tài)
# TIME_WAIT: 等待 2MSL

# 統(tǒng)計(jì)各狀態(tài)數(shù)量
ss -ant | awk'{print $1}'| sort | uniq -c | sort -rn

# 查看特定狀態(tài)
ss -ant state time-wait
ss -ant state close-wait
ss -ant state syn-sent

# 查看進(jìn)程對(duì)應(yīng)的連接
ss -tlnp
# 輸出示例:
# State   Recv-Q  Send-Q   Local Address:Port  Peer Address:Port  Process
# LISTEN  0     128    0.0.0.0:22      0.0.0.0:*       users:(("sshd",pid=1234,fd=3))

5 連接管理實(shí)戰(zhàn)

5.1 半連接隊(duì)列與全連接隊(duì)列

# 半連接隊(duì)列 (SYN Queue)
# 服務(wù)端收到 SYN 后進(jìn)入此隊(duì)列
# 大小由 tcp_max_syn_backlog 控制

cat /proc/sys/net/ipv4/tcp_max_syn_backlog
# 默認(rèn)值:128 (Linux 2.6+)

# 全連接隊(duì)列 (Accept Queue)
# 完成三次握手后,accept() 之前進(jìn)入此隊(duì)列
# 大小由 listen() 的 backlog 參數(shù)決定

# 查看隊(duì)列溢出
netstat -s | grep -i"overflow|listen"
# TCPBacklogDrop: 12345

# 查看當(dāng)前隊(duì)列狀態(tài)
ss -ltn
# Recv-Q: 當(dāng)前 accept 隊(duì)列中的連接數(shù)
# Send-Q: 對(duì)端未確認(rèn)的連接數(shù)

# 調(diào)整參數(shù)
echo2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo1024 > /proc/sys/net/core/somaxconn

5.2 TCP Keepalive

# TCP Keepalive 作用
# 檢測(cè)空閑連接是否仍然存活
# 適用于:長(zhǎng)連接、HTTP 長(zhǎng)輪詢(xún)

# 系統(tǒng)級(jí)配置
# /proc/sys/net/ipv4/tcp_keepalive_*

# 啟用 Keepalive
echo1 > /proc/sys/net/ipv4/tcp_keepalive_probes

# Keepalive 空閑時(shí)間(秒)
echo7200 > /proc/sys/net/ipv4/tcp_keepalive_time

# 探測(cè)間隔(秒)
echo75 > /proc/sys/net/ipv4/tcp_keepalive_intvl

# 探測(cè)次數(shù)
echo9 > /proc/sys/net/ipv4/tcp_keepalive_probes

# 應(yīng)用程序設(shè)置 Keepalive
python3 <

5.3 TCP 保活機(jī)制

# 查看連接空閑時(shí)間
ss -ti state established | grep -E"timer|Idle"

# 查看 Keepalive 狀態(tài)
cat /proc/net/sockstat
# sk_refcnt: 引用計(jì)數(shù)
# timer: 定時(shí)器狀態(tài)

# 示例:Nginx 配置 keepalive
# /etc/nginx/nginx.conf
http {
  upstream backend {
    server 127.0.0.1:8080;
    keepalive 32; # 保持的空閑連接數(shù)
  }

  server {
    location / {
      proxy_pass http://backend;
      proxy_http_version 1.1;
      proxy_set_header Connection"";
     # 或
     # proxy_set_header Connection "keep-alive";
    }
  }
}

5.4 連接復(fù)用與優(yōu)化

# tcp_timestamps 允許精確的 RTT 計(jì)算和 PAWS
cat /proc/sys/net/ipv4/tcp_timestamps
# 1 = 啟用

# tcp_sack 允許選擇性確認(rèn)
cat /proc/sys/net/ipv4/tcp_sack
# 1 = 啟用

# tcp_window_scaling 允許窗口縮放
cat /proc/sys/net/ipv4/tcp_window_scaling
# 1 = 啟用

# 查看當(dāng)前連接的窗口大小
ss -ti
# wscale: 發(fā)送窗口縮放因子
# rcv_wscale: 接收窗口縮放因子

# 調(diào)整 MTU 和 MSS
# MSS = MTU - IP頭(20) - TCP頭(20)
# 以太網(wǎng) MTU 通常 1500
# MSS 典型值:1460

# 查看 MSS
ss -i | grep -E"rcv_space|snd_wnd"

6 常見(jiàn) TCP 問(wèn)題排查

6.1 連接超時(shí)

# 排查步驟
# 1. 檢查網(wǎng)絡(luò)連通性
ping -c 5 target_host

# 2. 檢查路由
traceroute target_host
# 或
mtr target_host

# 3. 檢查目標(biāo)端口是否開(kāi)放
nc -zv target_host 80
# 或
nmap -p 80 target_host

# 4. 檢查本地端口范圍
cat /proc/sys/net/ipv4/ip_local_port_range
# 通常:32768 60999

# 5. 抓包分析
sudo tcpdump -i eth0 host target_host and port 80 -w /tmp/timeout.pcap

# 6. 分析三次握手
tshark -r /tmp/timeout.pcap -Y"tcp.flags.syn==1"-T fields -e frame.time -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport

6.2 連接被重置

# 排查 RST 原因
# 1. 端口未監(jiān)聽(tīng)
sudo tcpdump -i eth0'tcp[tcpflags] & tcp-rst != 0'-n

# 2. 防火墻攔截
sudo iptables -L -n | grep DROP
sudo iptables -L -n | grep REJECT

# 3. 服務(wù)崩潰
journalctl -u nginx | tail -50
systemctl status nginx

# 4. 常見(jiàn) RST 場(chǎng)景
# - 連接請(qǐng)求發(fā)送到未監(jiān)聽(tīng)的端口
# - SO_LINGER 設(shè)置為 0
# - 服務(wù)器重啟
# - 應(yīng)用調(diào)用 close() 而對(duì)方未讀取數(shù)據(jù)

6.3 連接隊(duì)列滿(mǎn)

# 現(xiàn)象:連接建立成功但無(wú)法通信

# 檢查半連接隊(duì)列溢出
netstat -s | grep -i"SYN"
# TCPRcvCoalesce: 12345
# TCPOFODrop: 123

# 檢查全連接隊(duì)列溢出
ss -ltn | grep Recv-Q
# 如果 Recv-Q 持續(xù)等于 backlog,說(shuō)明隊(duì)列滿(mǎn)

# 增加隊(duì)列大小
# 方法 1:臨時(shí)調(diào)整
echo8192 > /proc/sys/net/core/somaxconn
echo8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog

# 方法 2:永久調(diào)整
# /etc/sysctl.conf
cat >> /etc/sysctl.conf <

6.4 TIME_WAIT 過(guò)多

# 現(xiàn)象:連接數(shù)達(dá)到上限

# 檢查 TIME_WAIT 數(shù)量
ss -ant | awk'{print $1}'| sort | uniq -c | sort -rn

# 如果 TIME_WAIT 過(guò)多(> 10000)
# 解決方案:

# 1. 調(diào)整 tcp_fin_timeout
echo30 > /proc/sys/net/ipv4/tcp_fin_timeout

# 2. 啟用 tcp_tw_reuse(客戶(hù)端)
echo1 > /proc/sys/net/ipv4/tcp_tw_reuse

# 3. 使用 SO_LINGER 強(qiáng)制關(guān)閉
# 應(yīng)用程序代碼
struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
close(sock);
# 注意:這會(huì)導(dǎo)致 RST,可能造成數(shù)據(jù)丟失

# 4. 客戶(hù)端使用 HTTP Keep-Alive
# Nginx 作為反向代理時(shí):
# upstream 中配置 keepalive

# 5. 觀察實(shí)際影響
ss -s
# 如果實(shí)際連接數(shù)不高,TIME_WAIT 多是正常的

7 Wireshark 高級(jí)分析

7.1 常用過(guò)濾表達(dá)式

# 基本過(guò)濾
tcp.port == 80          # 端口 80
tcp.srcport == 12345      # 源端口
tcp.dstport == 443       # 目標(biāo)端口
ip.addr == 192.168.1.100    # IP 地址
tcp.flags.syn == 1       # SYN 標(biāo)志
tcp.flags.ack == 1       # ACK 標(biāo)志
tcp.flags.fin == 1       # FIN 標(biāo)志
tcp.flags.rst == 1       # RST 標(biāo)志

# 組合過(guò)濾
tcp.port == 80 and ip.addr == 192.168.1.100
tcp.flags.syn == 1 and tcp.flags.ack == 0 # 純粹的 SYN
tcp.flags.syn == 1 and tcp.flags.ack == 1 # SYN+ACK

# 序列號(hào)過(guò)濾
tcp.seq == 1000         # 特定序列號(hào)
tcp.ack == 2000         # 特定確認(rèn)號(hào)

# 時(shí)間過(guò)濾
frame.time_relative < 1 ? ? ? ? ??# 相對(duì)時(shí)間 < 1秒

# 專(zhuān)家信息
tcp.analysis.retransmission ? ? ?# 重傳
tcp.analysis.duplicate_ack ? ? ?# 重復(fù) ACK
tcp.analysis.out_of_order ? ? ? ?# 亂序
tcp.analysis.fast_retransmission?# 快速重傳

7.2 跟隨 TCP 流

# Wireshark 中跟隨 TCP 流
# 右鍵點(diǎn)擊包 -> Follow -> TCP Stream

# tshark 命令行跟隨流
# 1. 找到流索引
tshark -r /tmp/capture.pcap -q -z"conv,tcp"| head -20

# 2. 跟隨特定流
tshark -r /tmp/capture.pcap -Y"tcp.stream eq 0"-T fields -e data

# 3. 導(dǎo)出完整 HTTP 會(huì)話
tshark -r /tmp/capture.pcap -Y"http"-T fields -e ip.src -e http.request.method -e http.request.uri

7.3 TCP 統(tǒng)計(jì)分析

# 流統(tǒng)計(jì)
tshark -r /tmp/capture.pcap -q -z"io,stat,0.1,tcp.len"| head -30

# 連接統(tǒng)計(jì)
tshark -r /tmp/capture.pcap -q -z"conv,tcp"

# 重傳統(tǒng)計(jì)
tshark -r /tmp/capture.pcap -q -z"io,stat,0.1,tcp.analysis.retransmission"

# 繪制時(shí)間序列圖
# Wireshark -> Statistics -> TCP Stream Graphs
# - Time-Sequence Graph (Stevens)
# - Throughput Graph
# - Round Trip Time Graph

7.4 抓包腳本

#!/bin/bash
# tcp_capture.sh - TCP 抓包腳本

CAPTURE_FILE="/tmp/tcp_capture_$(date +%Y%m%d_%H%M%S).pcap"
FILTER="$1"
DURATION="${2:-60}"# 默認(rèn) 60 秒

if[ -z"$FILTER"];then
 echo"用法:$0<過(guò)濾器> [持續(xù)秒數(shù)]"
 echo"示例:$0'tcp port 80' 120"
 exit1
fi

echo"開(kāi)始抓包..."
echo"過(guò)濾器:$FILTER"
echo"持續(xù)時(shí)間:${DURATION}秒"
echo"輸出文件:$CAPTURE_FILE"

# 使用 tcpdump 抓包
sudo tcpdump -i eth0 -w"$CAPTURE_FILE""$FILTER"&
PID=$!

# 等待指定時(shí)間
sleep"$DURATION"

# 停止抓包
kill$PID2>/dev/null
wait$PID2>/dev/null

echo"抓包完成"
echo"文件大小:$(du -h "$CAPTURE_FILE" | cut -f1)"

# 快速統(tǒng)計(jì)
echo""
echo"=== 抓包統(tǒng)計(jì) ==="
echo"總包數(shù):$(sudo tcpdump -r "$CAPTURE_FILE" 2>/dev/null | wc -l)"
echo"SYN 包:$(sudo tcpdump -r "$CAPTURE_FILE" 'tcp[tcpflags] == tcp-syn' 2>/dev/null | wc -l)"
echo"FIN 包:$(sudo tcpdump -r "$CAPTURE_FILE" 'tcp[tcpflags] == tcp-fin' 2>/dev/null | wc -l)"
echo"RST 包:$(sudo tcpdump -r "$CAPTURE_FILE" 'tcp[tcpflags] == tcp-rst' 2>/dev/null | wc -l)"

8 實(shí)戰(zhàn)案例分析

案例一:Web 服務(wù)偶發(fā)性連接失敗

現(xiàn)象:用戶(hù)反饋網(wǎng)站偶爾打不開(kāi),刷新后正常

排查過(guò)程

# 1. 在服務(wù)端抓包
sudo tcpdump -i eth0 -w /tmp/http_issue.pcap'tcp port 80'&
sleep 30
# 等待問(wèn)題復(fù)現(xiàn)
kill%1

# 2. 分析抓包文件
tshark -r /tmp/http_issue.pcap -Y"tcp.flags.syn==1"-T fields 
  -e frame.time_relative -e ip.src -e tcp.srcport 
  -e ip.dst -e tcp.dstport -e tcp.len | head -20

# 3. 查找 SYN 重傳
tshark -r /tmp/http_issue.pcap -Y"tcp.analysis.retransmission"| wc -l
# 如果有重傳,說(shuō)明網(wǎng)絡(luò)或服務(wù)端有問(wèn)題

# 4. 檢查服務(wù)端 backlog
ss -ltn | grep :80
# Recv-Q 應(yīng)該接近 0,Send-Q 應(yīng)該較小

# 5. 查看系統(tǒng)連接限制
cat /proc/sys/net/core/somaxconn
cat /proc/sys/net/ipv4/tcp_max_syn_backlog

根因:服務(wù)端 somaxconn 過(guò)小,高峰期 SYN 隊(duì)列溢出。

解決

# 增加隊(duì)列大小
echo4096 > /proc/sys/net/core/somaxconn
echo8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog

# Nginx 配置
# worker_processes auto;
# worker_connections 4096;
# listen 80 backlog=4096;

案例二:數(shù)據(jù)庫(kù)連接池耗盡

現(xiàn)象:應(yīng)用日志顯示 "Too many connections"

# 1. 檢查 MySQL 連接數(shù)
mysql -u root -p -e"SHOW PROCESSLIST;"| wc -l
mysql -u root -p -e"SHOW STATUS LIKE 'Threads_connected';"

# 2. 檢查 TIME_WAIT
netstat -an | grep TIME_WAIT | wc -l
# 大量 TIME_WAIT 說(shuō)明連接沒(méi)有正確復(fù)用

# 3. 檢查連接來(lái)源
netstat -ant | awk'{print $5}'| cut -d: -f1 | sort | uniq -c | sort -rn | head -10

# 4. 查看慢查詢(xún)
mysql -u root -p -e"SHOW GLOBAL STATUS LIKE 'Slow_queries';"

根因:應(yīng)用使用短連接,每次請(qǐng)求都創(chuàng)建新連接,高并發(fā)時(shí)耗盡連接池。

解決

# 方案 1:使用連接池
importmysql.connector.pool

pool = mysql.connector.pooling.MySQLConnectionPool(
  pool_name="mypool",
  pool_size=10,
  host="localhost",
  database="test"
)

# 使用連接
conn = pool.get_connection()
cursor = conn.cursor()
# ... 操作后歸還連接
conn.close() # 實(shí)際歸還到池中

案例三:API 請(qǐng)求超時(shí)

現(xiàn)象:移動(dòng)端 API 調(diào)用超時(shí)率高

# 1. 檢查網(wǎng)絡(luò)質(zhì)量
ping -c 20 api.example.com
# 查看 RTT 抖動(dòng)

# 2. 分析 TCP 重傳
sudo tcpdump -i eth0 -w /tmp/api_tcp.pcap'host api.example.com'&
# 復(fù)現(xiàn)問(wèn)題
tshark -r /tmp/api_tcp.pcap -Y"tcp.analysis.retransmission"| wc -l

# 3. 檢查 TCP 窗口
# 在 Wireshark 中查看 Window Size 變化
# 如果 Window 接近 0,說(shuō)明接收端 buffer 滿(mǎn)

# 4. 查看服務(wù)處理時(shí)間
# 應(yīng)用日志中的請(qǐng)求處理時(shí)間
# nginx access log 的 response_time

根因:服務(wù)端處理慢,TCP 窗口收縮,客戶(hù)端收不到數(shù)據(jù)而超時(shí)。

解決

# 1. 增加服務(wù)端 buffer
echo16777216 > /proc/sys/net/core/rmem_max
echo16777216 > /proc/sys/net/core/wmem_max

# 2. Nginx 配置
# proxy_buffering on;
# proxy_buffer_size 128k;
# proxy_buffers 4 256k;

# 3. 應(yīng)用優(yōu)化
# - 增加處理線程
# - 使用異步處理
# - 優(yōu)化數(shù)據(jù)庫(kù)查詢(xún)

9 總結(jié)與速查表

三次握手狀態(tài)機(jī)

客戶(hù)端               服務(wù)端
CLOSED ──────────────────────────> LISTEN
 |                  |
 | 1. 發(fā)送 SYN           |
 |  SEQ=c_isn           |
 | ─────────────────────────────>  |
 |                  |
 |       SYN_SENT       LISTEN
 |                  |
 | <───────────────────────────── ? ?|
? ?| 2. 收到 SYN+ACK ? ? ? ? ? ? ? ? ? |
? ?| ? ?SEQ=s_isn ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ?ACK=c_isn+1 ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? ? ?SYN_RCVD ? ? ? ? ? ? |
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| 3. 發(fā)送 ACK ? ? ? ? ? ? ? ? ? ? ? |
? ?| ? ?ACK=s_isn+1 ? ? ? ? ? ? ? ? ? ? |
? ?| ──────────────────────────────>  |
 |                  |
 |     ESTABLISHED       ESTABLISHED
 |                  |

四次揮手狀態(tài)機(jī)

主動(dòng)方               被動(dòng)方
ESTABLISHED ──────────────────────> ESTABLISHED
 |                  |
 | 1. 發(fā)送 FIN            |
 |  SEQ=x              |
 | ──────────────────────────────>  |
 |                  |
 |      FIN_WAIT_1       CLOSE_WAIT
 |                  |
 | <───────────────────────────── ? ?|
? ?| 2. 收到 ACK ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ?ACK=x+1 ? ? ? ? ? ? ? ? ? ? ? ? |
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? FIN_WAIT_2 ? ? ? ? ? ? ?CLOSE_WAIT
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| 3. 數(shù)據(jù)發(fā)送完畢
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?調(diào)用 close()
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?發(fā)送 FIN
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?SEQ=y
? ?| <───────────────────────────── ? ?|
? ?| 4. 收到 FIN ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ?SEQ=y ? ? ? ? ? ? ? ? ? ? ? ? ? |
? ?| ? ?發(fā)送 ACK ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ?ACK=y+1 ? ? ? ? ? ? ? ? ? ? ? ? |
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? TIME_WAIT ? ? ? ? ? ? ? LAST_ACK
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| <───────────────────────────── ? ?|
? ?| 5. 收到 ACK ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
? ?| ? ? ? ? ? CLOSED ? ? ? ? ? ? ? ? ?CLOSED

TCP 狀態(tài)速查

狀態(tài) 客戶(hù)端 服務(wù)端 說(shuō)明
LISTEN ? 等待連接
SYN_SENT ? 已發(fā)送 SYN
SYN_RCVD ? 收到 SYN
ESTABLISHED ? ? 連接建立
FIN_WAIT_1 ? 已發(fā) FIN
FIN_WAIT_2 ? 收到 ACK
CLOSE_WAIT ? 收到 FIN
TIME_WAIT ? 等待 2MSL
LAST_ACK ? 最后確認(rèn)

常用命令速查

# 查看連接狀態(tài)
ss -ant               # 所有 TCP 連接
ss -ti               # 連接詳細(xì)信息(帶 timer)
ss -tlnp              # 監(jiān)聽(tīng)端口

# 抓包分析
tcpdump -i eth0'tcp port 80'-w a.pcap
tshark -r a.pcap -Y"tcp"-T fields

# 查看網(wǎng)絡(luò)參數(shù)
cat /proc/sys/net/ipv4/tcp_*
sysctl -a | grep tcp

# 連接統(tǒng)計(jì)
netstat -s | grep -i tcp
ss -s

故障排查流程

TCP 連接異常
  |
  ├── 三次握手問(wèn)題
  |  ├── SYN 沒(méi)發(fā)出  -> 檢查網(wǎng)絡(luò)
  |  ├── SYN 沒(méi)收到  -> 檢查防火墻
  |  ├── SYN+ACK 沒(méi)收到 -> 抓包分析
  |  └── ACK 沒(méi)發(fā)出  -> 抓包分析
  |
  ├── 四次揮手問(wèn)題
  |  ├── FIN 沒(méi)發(fā)出  -> 檢查應(yīng)用 close()
  |  ├── TIME_WAIT 多 -> 調(diào)整參數(shù)或連接復(fù)用
  |  └── CLOSE_WAIT 多 -> 應(yīng)用未關(guān)閉連接
  |
  ├── 連接中斷
  |  ├── RST 原因   -> 抓包分析
  |  ├── 重傳過(guò)多   -> 檢查網(wǎng)絡(luò)質(zhì)量
  |  └── 超時(shí)     -> 檢查延遲
  |
  └── 性能問(wèn)題
    ├── 窗口為 0   -> 增加 buffer
    ├── 隊(duì)列滿(mǎn)    -> 增加 somaxconn
    └── 大量短連接  -> 使用連接池

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    8340

    瀏覽量

    95600
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1434

    瀏覽量

    83782
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3831

    瀏覽量

    52287

原文標(biāo)題:初中級(jí)運(yùn)維怎么理解 TCP 三次握手和四次揮手?

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    講一講的TCP三次握手四次揮手

    如果你學(xué)過(guò)網(wǎng)絡(luò)基礎(chǔ)知識(shí),那么你一定對(duì)TCP三次握手不陌生。今天我想用通俗的話來(lái)給大家講一講TCP三次握手
    的頭像 發(fā)表于 02-03 10:43 ?3531次閱讀
    講一講的<b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>和<b class='flag-5'>四次</b><b class='flag-5'>揮手</b>

    三次握手四次揮手你懂嗎

    程序員面試被問(wèn)到“三次握手,四次揮手”怎么辦?
    發(fā)表于 04-08 07:23

    TCP三次握手的過(guò)程描述

    本文檔主要描述TCP三次握手的過(guò)程,一個(gè)完整的三次握手也就是 請(qǐng)求---應(yīng)答---再次確認(rèn)
    發(fā)表于 03-02 15:37 ?8次下載

    TCP/IP協(xié)議工作過(guò)程的三次握手四次揮手

    )、第三次握手:Client收到確認(rèn)后,檢查ACK是否為1,如果正確則將標(biāo)志位ACK置為1,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ACK是否為1,如果正確則連接建立成功,Client
    的頭像 發(fā)表于 10-25 09:49 ?7693次閱讀

    TCP三次握手過(guò)程及四次揮手過(guò)程說(shuō)明

    三次握手 置位概念:根據(jù) TCP 的包頭字段,存在 3 個(gè)重要的標(biāo)識(shí) ACK、SYN、FIN ACK:表示驗(yàn)證字段 SYN:位數(shù)置 1,表示建立 TCP 連接 FIN:位數(shù)置 1,表示
    的頭像 發(fā)表于 03-01 12:00 ?4952次閱讀

    TCP三次握手四次揮手以及11種狀態(tài)資料下載

    電子發(fā)燒友網(wǎng)為你提供TCP三次握手四次揮手以及11種狀態(tài)資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料
    發(fā)表于 04-15 08:41 ?2次下載
    <b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>和<b class='flag-5'>四次</b><b class='flag-5'>揮手</b>以及11種狀態(tài)資料下載

    TCP三次握手四次揮手過(guò)程中的異常情況

    TCP 三次握手四次揮手過(guò)程中,途中某一步的報(bào)文丟失了,會(huì)發(fā)生什么?
    的頭像 發(fā)表于 09-05 10:23 ?2142次閱讀

    如何使用WireShark進(jìn)行TCP三次握手

    WireShark是一種非常方便的網(wǎng)絡(luò)抓包工具,下面演示,使用WireShark來(lái)抓取TCP三次握手過(guò)程。
    的頭像 發(fā)表于 11-01 09:50 ?3023次閱讀

    TCP建立連接概述及三次握手四次揮手的流程

    具備上述個(gè)條件后A獲取B的信息是有要求的,根本上的要求是數(shù)據(jù)信道可靠,就是平時(shí)所說(shuō)的可靠連接,那么如何保證連接的可靠性呢,TCP協(xié)議就是靠確認(rèn)應(yīng)答機(jī)制、超時(shí)重傳機(jī)制等保證連接可靠性的,接下來(lái)就通過(guò)TCP協(xié)議的
    的頭像 發(fā)表于 03-23 15:57 ?2220次閱讀
    <b class='flag-5'>TCP</b>建立連接概述及<b class='flag-5'>三次</b><b class='flag-5'>握手</b>、<b class='flag-5'>四次</b><b class='flag-5'>揮手</b>的流程

    用戀愛(ài)的方式解釋TCP三次握手四次揮手

    前言今天的分享,是關(guān)于前兩天讀到的心得,TCP建立連接時(shí)三次握手,斷開(kāi)時(shí)為何4握手的自我理解
    的頭像 發(fā)表于 08-28 16:11 ?1645次閱讀
    用戀愛(ài)的方式解釋<b class='flag-5'>TCP</b>的<b class='flag-5'>三次</b><b class='flag-5'>握手</b>和<b class='flag-5'>四次</b><b class='flag-5'>揮手</b>

    說(shuō)說(shuō)TCP三次握手的過(guò)程?為什么是三次而不是兩四次?

    說(shuō)說(shuō)TCP三次握手的過(guò)程?為什么是三次而不是兩、四次? T
    的頭像 發(fā)表于 02-04 11:03 ?2049次閱讀

    TCP三次握手協(xié)議的作用

    在計(jì)算機(jī)網(wǎng)絡(luò)中,數(shù)據(jù)的傳輸需要在發(fā)送方和接收方之間建立一個(gè)穩(wěn)定的連接,以確保數(shù)據(jù)的完整性和順序。TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它通過(guò)三次握手協(xié)議來(lái)建立
    的頭像 發(fā)表于 01-03 17:15 ?1849次閱讀

    TCP三次握手安全性分析

    TCP(傳輸控制協(xié)議)的三次握手是建立可靠連接的重要機(jī)制,它確保了通信雙方在數(shù)據(jù)傳輸前的連接狀態(tài)是可靠和準(zhǔn)確的。然而,從安全性的角度來(lái)分析,TCP
    的頭像 發(fā)表于 01-03 18:10 ?2045次閱讀

    TCP三次握手四次揮手,這樣解釋太通俗易懂了!

    TCP連接的建立和釋放分別通過(guò)“三次握手”和“四次揮手”來(lái)完成。三次
    的頭像 發(fā)表于 04-24 19:33 ?1695次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>和<b class='flag-5'>四次</b><b class='flag-5'>揮手</b>,這樣解釋太通俗易懂了!

    TCP三次握手四次揮手的詳細(xì)過(guò)程

    TCP 三次握手四次揮手,大概是網(wǎng)絡(luò)領(lǐng)域被問(wèn)爛了的面試題。但真正能把狀態(tài)變遷、序列號(hào)變化、抓包細(xì)節(jié)講清楚的人并不多。很多人背了八股文,一到
    的頭像 發(fā)表于 02-25 10:38 ?459次閱讀
    海城市| 上高县| 绵阳市| 莱芜市| 安新县| 出国| 延边| 莎车县| 木里| 龙陵县| 淄博市| 句容市| 镇坪县| 安庆市| 班戈县| 高青县| 红河县| 平遥县| 临沧市| 新巴尔虎右旗| 墨玉县| 嘉荫县| 长宁县| 九台市| 全南县| 齐河县| 吉木乃县| 东至县| 嵊州市| 张家川| 兴山县| 商丘市| 治县。| 旺苍县| 南川市| 平度市| 玉门市| 岑巩县| 普兰店市| 眉山市| 巴林左旗|