TCP的連接和終止(TCP/IP詳解)
Posted on 2010-12-14 17:33 幻海藍(lán)夢 閱讀(14553) 評論(2) 編輯 收藏 所屬分類: 通信產(chǎn)品--相關(guān)知識(shí)TCP的連接和終止
TCP是一個(gè)面向連接的協(xié)議。在傳輸數(shù)據(jù)前必須要建立連接,在停止傳輸數(shù)據(jù)后要終止連接釋放資源。
一.TCP連接建立
TCP連接是在IP網(wǎng)絡(luò)中兩個(gè)進(jìn)程間(應(yīng)用層協(xié)議)的雙向、全雙工的邏輯回路。由節(jié)點(diǎn)的IP地址和端口將連接雙方對應(yīng)起來。
1.TCP連接特點(diǎn):
- 通過一個(gè)握手進(jìn)程建立起來;
- 通過一個(gè)周期性保持進(jìn)程來保持,保證兩個(gè)TCP節(jié)點(diǎn)間處于激活狀態(tài);
- 通過一個(gè)握手進(jìn)程來終止,釋放資源。
- TCP連接也被連接中的任意一端重置。
1.TCP連接的建立
為了建立連接TCP連接雙方必須從對方了解下面的信息:
- 1.對方數(shù)據(jù)發(fā)送的開始序列號(hào);
- 2.對方在出站管道上發(fā)送數(shù)據(jù)的緩沖區(qū)大小;
- 3.能被接收的最大段MSS;
- 4.被支持的TCP選項(xiàng);
通
過3個(gè)TCP段的交換來了解這些信息,就是常說的TCP
握手的3個(gè)包。一般在客戶端訪問TCP服務(wù)器的時(shí)候,在客戶端初始化一個(gè)TCP連接,服務(wù)器端打開一個(gè)特殊端口等待傳入的請求。客戶端主動(dòng)發(fā)起第一個(gè)
SYN置位的包開始協(xié)商TCP連接。服務(wù)器接收后向客戶端回ACK,最后客戶端在向服務(wù)器回復(fù)ACK后連接建立。
下面我們用TCP連接的兩個(gè)對等端A和B來詳細(xì)介紹握手過程,其中發(fā)起方是A。
- 段一:同步(SYN)段
TCP連接的發(fā)起方A向B發(fā)送第一個(gè)TCP同步段(SYN).在TCP頭部的選項(xiàng)中會(huì)包含一些選項(xiàng)與對端協(xié)商。
TCP 頭部包含如下字段:
目的端口 TCP連接對端B被動(dòng)打開的TCP端口數(shù)
源端口 TCP連接發(fā)起方A主動(dòng)打開的端口,大多數(shù)是一個(gè)隨機(jī)一個(gè)端口。
序列號(hào) SYN的序列號(hào)ISN1可以看作是一個(gè)32位的計(jì)數(shù)器,由發(fā)起方A產(chǎn)生,具有一定的隨機(jī)性。Windows 2003和XP根據(jù)派生啟動(dòng)(startup-derived)、2048位的隨機(jī)密鑰和一個(gè)基于RC4的隨機(jī)數(shù)來計(jì)算ISN,從而減少下一TCP連接的 ISN被預(yù)測的可能性。
確認(rèn)號(hào) 設(shè)置為0.SYN握手第一個(gè)包的ACK字段不重要,此時(shí)剛發(fā)起連接沒有數(shù)據(jù)報(bào)需要確認(rèn)。但后續(xù)的ACK是重要的。
SYN標(biāo)志 置1.
窗口 設(shè)置為默認(rèn)值,指示本地TCP接收緩沖區(qū)大小的初始值。
MSS TCP選項(xiàng)中的MSS 指示發(fā)起方A接收的最大的TCP段。
選擇性確認(rèn)(SACK) –TCP選項(xiàng) 如果包含這個(gè)字段,可以指示發(fā)起方A 的TCP能接收和解釋此選項(xiàng)。
窗口縮放選項(xiàng) 如果包含,指示出發(fā)起方A的TCP能接收和支持此選項(xiàng)。協(xié)商好窗口因子后此連接就固定使用直到斷開連接
一個(gè)FTP會(huì)話的SYN段 - 段二:SYN-ACK段
在B收到SYN包后,B將發(fā)SYN-ACK,TCP選項(xiàng)僅包含發(fā)起方A發(fā)送的SYN包中的的選項(xiàng)。
目的端口 設(shè)置為A的源端口
源端口 設(shè)置為B端口
序列號(hào) B產(chǎn)生自己的序列號(hào)ISN2。和A發(fā)送的SYN中的ISN沒有關(guān)系,僅產(chǎn)生的方法一樣。
確認(rèn)號(hào) 期望收到的對端的下一個(gè)字節(jié)ISN1+1.
SYN標(biāo)志 置1.
ACK標(biāo)志 置1,必須有此標(biāo)志,除了SYN中置0外,SYN之后的所有報(bào)文(包括SYN-ACK和實(shí)際數(shù)據(jù)包都會(huì)帶ACK的標(biāo)志)。
窗口 設(shè)置B可以接收的最大窗口值,一般根據(jù)應(yīng)用程序或者操作系統(tǒng)默認(rèn)指定。
MSS TCP選項(xiàng) 設(shè)為B能接收的最大長度的TCP段;
SACK-許可 如果A發(fā)送的SYN包含此選項(xiàng)時(shí)才使用此選項(xiàng),表示B的TCP能接收和解釋SACK選項(xiàng)。
窗口縮放選項(xiàng) 如果SYN包含,此時(shí)才會(huì)包含。
一個(gè)FTP會(huì)話的SYN-ACK段 - 段3:ACK段
在TCP連接的發(fā)起方A收到SYN-ACK后,A再向B發(fā)送ACK。ACK中確認(rèn)被發(fā)起方A使用的最終TCP參數(shù),同時(shí)向B確認(rèn)它該使用同樣的參數(shù)。自此TCP連接建立完成。
一個(gè)FTP會(huì)話的SYN-ACK段
2.同時(shí)打開
兩個(gè)應(yīng)用程序同時(shí)執(zhí)行主動(dòng)建立TCP的連接的可能性是存在的,此時(shí)發(fā)送到SYN建立需要交換4個(gè)包,如圖所示:
需要注意的是,即使同時(shí)打開仍然只建立一條連接。(但其他的協(xié)議不一定)
3.TCP 連接的結(jié)果
- 1.每一個(gè)TCP對等端知道連接上對方將被發(fā)送的第一個(gè)字節(jié)的序列號(hào)(發(fā)給對方的確認(rèn)號(hào),A發(fā)給B的確認(rèn)號(hào)就是B將發(fā)送的序列號(hào),同樣B也是。)
- 2.每一個(gè)TCP對等端知道連接上能發(fā)送的MSS。選取握手階段SYN和SYN+ACK包中MSS選項(xiàng)中較小的值。以此值開始進(jìn)行PMTU的發(fā)現(xiàn)機(jī)制。
- 3.知道連接對端接收緩沖區(qū)大小,即窗口大小。
- 4.每個(gè)對等端知道對方能否使用SACK,窗口縮放等選項(xiàng)。
4.Windows控制TCP建立連接進(jìn)程的注冊表:
TcpMaxConnectRetransmissions
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:0~255
Default value:2
Present by default:No
設(shè)定當(dāng)試圖建立一個(gè)TCP連接時(shí),會(huì)重傳多少次SYN。每次間隔時(shí)間加倍。初始的RTO為3秒,并且默認(rèn)值為2,這樣第一次SYN等待3秒后重傳第一次,在等待6秒后重傳第二次,在等待12秒沒有SYN+ACK就超時(shí)了。
TcpNumConnections
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:0~0xFFFFFF
Default value:0xFFFFFF
Present by default:No
設(shè)定能打開的TCP最大數(shù)。默認(rèn)能打開16777214(0xFFFFFF)個(gè)連接。
5.TCP半開連接
TCP
半開連接是未完成的連接建立的進(jìn)程的一個(gè)TCP連接,收到一個(gè)SYN包,并且一個(gè)SYN-ACK已經(jīng)發(fā)送,但是最后的ACK沒有收到。前面知道XP默認(rèn)設(shè)
置情況下在發(fā)送2個(gè)重傳SYN-ACK后等待12秒后放棄連接,并釋放內(nèi)存和連接的內(nèi)部表項(xiàng),從收到SYN到釋放總共會(huì)花費(fèi)21秒。
SYN-ACK重傳輸?shù)囊粋€(gè)半開連接
- SYN攻擊
SYN攻擊就是利用這種方法,使用偽裝的IP地址和TCP端口,在短時(shí)間內(nèi)制造大量的半開連接來耗盡資源,造成拒絕服務(wù)攻擊。大量的半開連接能做如下事情:
1.使用所有可用的內(nèi)存,
2.使用在TCP傳輸控制模塊(TCB)中所有可能的項(xiàng),這是一個(gè)用來跟蹤TCP連接的內(nèi)部表,一旦半開連接使用完所有的項(xiàng),就用一個(gè)TCP連接復(fù)位來響應(yīng)下一個(gè)連接企圖。
3.使用所有可能的半開連接,此后用一個(gè)TCP連接復(fù)位響應(yīng)下一個(gè)連接企圖。
可以使用netstat -n -p tcp 查看TCP連接狀態(tài),包括半開連接。如果state出現(xiàn)大量的SYN-RECEIVED就該受到SYN攻擊了。
Windows xp和2003 在檢測和防護(hù)SYN攻擊方面的注冊表:
TcpMaxConnectResponseRetransmissions
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:0~255
Default value:2
Present by default:No
設(shè)定針對半開連接的一個(gè)AYN-ACK的重傳數(shù)目,對于大于1的值使用SYN攻擊防護(hù)機(jī)制。
SynAttackProtect
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:0~1
Default value:0
Present by default:No
設(shè)置為0禁用SYN攻擊防護(hù),1啟用SYN攻擊防護(hù)。被啟用時(shí),檢測到SYN攻擊,則半開連接的超時(shí)會(huì)更快些。
TcpMaxHalfOpen
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:100~65535
Default value:100 for windows xp 和Windows 2003 web版及標(biāo)準(zhǔn)版,500 for Windows 2003 企業(yè)版和數(shù)據(jù)中心版
Present by default:No
在SYN攻擊防護(hù)起作用前,此鍵值設(shè)定了在SYN-RECEIVED狀態(tài)中的TCP鏈接最大數(shù)。
TcpMaxHalfOpenRetried
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:80~65535
Default value:80 for windows xp 和Windows 2003 web版及標(biāo)準(zhǔn)版,400 for Windows 2003 企業(yè)版和數(shù)據(jù)中心版
Present by default:No
在SYN-RECEIVED狀態(tài)中設(shè)定TCP連接的最大數(shù)并且在SYN攻擊防護(hù)起作用前至少發(fā)送過一個(gè)重傳。
6.TCP連接的維持
在 建立TCP連接后,必須有一些機(jī)制維持TCP連接。如果TCP建立連接后不傳輸任何數(shù)據(jù)也沒有應(yīng)用級別的保活機(jī)制時(shí),那么TCP連接一直存在,數(shù)天,數(shù)月 會(huì)一直存在。中間的路由器可能重啟,崩潰,TCP連接的雙方無從知道,許多時(shí)候一個(gè)服務(wù)器希望知道客戶主機(jī)是否崩潰并關(guān)機(jī)或者崩潰又重新啟動(dòng)。許多實(shí)現(xiàn)提 供的保活定時(shí)器可以提供這種能力。但這個(gè)規(guī)范并不推薦,理由如下:
- 在出現(xiàn)短暫差錯(cuò)的情況下,這可能會(huì)使一個(gè)非常好的連接釋放掉;
- 它們耗費(fèi)不必要的帶寬;
- 在按分組計(jì)費(fèi)的情況下會(huì)在互聯(lián)網(wǎng)上花掉更多的錢。
TCP保活定時(shí)器(keepalive)
Windows 中TCP通過一個(gè)TCP keepalive的周期性交換,能維持一個(gè)TCP連接。在keepalive的TCP頭部序列號(hào)字段被設(shè)為比當(dāng)前出站數(shù)據(jù)流的序列號(hào)小1的值。如果一個(gè) TCP對等端的下一個(gè)數(shù)據(jù)的字節(jié)序列號(hào)是N,那么keepalive的序列號(hào)是N-1.
在接收到keepalive包后,對等端回送一個(gè)ACK字段,并將確認(rèn)號(hào)置為下一個(gè)期望收到的字節(jié)N,這個(gè)交換證實(shí)了兩個(gè)對等端仍然處于TCP連接狀態(tài)中。
Windows 2003 和 XP的TCP/IP在默認(rèn)情況下禁用TCP的keepalive.啟用情況下每2個(gè)小時(shí)發(fā)送一次keepalive。如果其他上層協(xié)議的保活機(jī)制時(shí)間小于keepalive,tcp的keepalive將不會(huì)發(fā)送。
相關(guān)注冊表
KeepAliveTime
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:0~0xFFFFFFFF
Default value:0x6DDD00 (2小時(shí))
Present by default:No
如果連接上沒有沒有數(shù)據(jù),并且啟用keepalive,此鍵值在每一個(gè)TCP保持活躍包之間設(shè)置了毫秒數(shù),默認(rèn)是2小時(shí)。
KeepAliveInterval
Location:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Data Type:REG_DWORD
Valid range:0~0xFFFFFFFF
Default value:0x3E8 (1000毫秒)
Present by default:No
在沒有接收到對初始的保持活躍的響應(yīng)時(shí),此鍵值設(shè)置了重傳時(shí)間默認(rèn)是1秒。重傳數(shù)目受TcpMaxDataRetransmission鍵值控制,默認(rèn)是5.此時(shí)的重傳不會(huì)有指數(shù)級的回退行為。
如果都啟用且是默認(rèn),無數(shù)據(jù)傳輸?shù)腡CP連接在keepalive包發(fā)出后2小時(shí)6秒收不到ACK就放棄連接。
舉例:
另一端崩潰
keepalive機(jī)制在重復(fù)發(fā)送探測包到一定次數(shù)后報(bào)錯(cuò),由TCP轉(zhuǎn)換為“連接超時(shí)”
另一端崩潰而重啟
客戶端telnet到服務(wù)器后,我們拔掉服務(wù)器網(wǎng)線重啟服務(wù)器,服務(wù)器重啟好后我們在telnet客戶端上輸入命令。服務(wù)器重啟后丟失了以前連接的所有信息,此時(shí)服務(wù)器收到來著telnet客戶端的命令,不知道此連接的信息,于是TCP就以復(fù)位作為應(yīng)答來結(jié)束TCP連接。
另外一端不可達(dá)
拔掉網(wǎng)線,模擬中間路由器崩潰,keepalive探測的時(shí)候會(huì)引起ICMP差錯(cuò)“不可達(dá)--沒有到達(dá)主機(jī)的路由”反饋給主機(jī)。
二.TCP連接的終止
TCP的連接終止需要4個(gè)包交換來完成。在兩個(gè)邏輯管道上每個(gè)邏輯管道上發(fā)送方發(fā)送FIN置位的終止包,然后收到ACK后關(guān)閉該邏輯管道的連接。
TCP連接終止的4個(gè)TCP段交換過程
段1:來自TCP對等端A的FIN-ACK
一個(gè)期望終止出站數(shù)據(jù)流的TCP對等端(A)發(fā)送一個(gè)不包含任何數(shù)據(jù)的TCP段,他具有如下特點(diǎn):
- 序列號(hào),和發(fā)送帶數(shù)據(jù)TCP段一樣設(shè)置為出站數(shù)據(jù)的當(dāng)前序列號(hào),且當(dāng)前序列號(hào)是最終序列號(hào)FSN1,因?yàn)轳R上要關(guān)閉了。
- 確認(rèn)序列號(hào) 被設(shè)為TCP對等端A期望對方發(fā)送的下一個(gè)字節(jié)。對應(yīng)TCP對等端B當(dāng)前序列號(hào)CSN2。
- 設(shè)置ACK標(biāo)志
- 設(shè)置FIN標(biāo)志,指示此邏輯管道上沒有其他數(shù)據(jù)需要發(fā)送。
ftp服務(wù)器關(guān)閉FTP會(huì)話的Fin-ack段
段2:來自TCP對等端B的ACK
與SYN類似,F(xiàn)IN包也會(huì)占用一個(gè)字節(jié)的序列空間,并且必須把它當(dāng)作是一個(gè)字節(jié)數(shù)據(jù)來確認(rèn)。所以B接收到FIN-ACK后必須發(fā)送一個(gè)ACK,具有如下特點(diǎn):
- 序列號(hào) 設(shè)為出站數(shù)據(jù)的當(dāng)前序列號(hào)CSN2
- 確認(rèn)號(hào)字段被設(shè)為比對端A發(fā)送的最終序列號(hào)多1的值FSN1+1.
- 設(shè)置ACK標(biāo)志。
ftp服務(wù)器關(guān)閉FTP會(huì)話的Fin-ack段的ACK
一旦FIN-ACK被確認(rèn),發(fā)送初始FIN-ACK端A就不能再發(fā)送數(shù)據(jù)了,這僅終止了一個(gè)邏輯管道的連接,TCP對等端B發(fā)送數(shù)據(jù)到A的邏輯管道仍然開放,B仍然可以發(fā)數(shù)據(jù)給A。
段三:來自TCP對等端B的FIN-ACK
前面對等端A向B發(fā)送數(shù)據(jù)的邏輯管道被關(guān)閉后,如果B向A發(fā)送數(shù)據(jù)的邏輯管道仍然有數(shù)據(jù)發(fā)送,且被對等端A確認(rèn),這就是TCP半關(guān)閉。TCP對等端B向A發(fā)送數(shù)據(jù)的邏輯管道沒有數(shù)據(jù)發(fā)送后,也要B向A發(fā)送FIN-ACK來關(guān)閉。
特點(diǎn):
- 序列號(hào),和發(fā)送帶數(shù)據(jù)TCP段一樣設(shè)置為出站數(shù)據(jù)的當(dāng)前序列號(hào),且當(dāng)前序列號(hào)最終序列號(hào)FSN2,因?yàn)轳R上要關(guān)閉了。
- 確認(rèn)序列號(hào) 被設(shè)為TCP對等端A期望對方發(fā)送的下一個(gè)字節(jié)。對應(yīng)TCP對等端A當(dāng)前序列號(hào)FSN1+1。
- 設(shè)置ACK標(biāo)志
- 設(shè)置FIN標(biāo)志,指示此邏輯管道上沒有其他數(shù)據(jù)需要發(fā)送

ftp客戶端關(guān)閉FTP會(huì)話的Fin-ack段
段四:來自TCP對等端A的ACK
同樣段三的FIN-ACK包也按占用了一個(gè)字節(jié)算,并且必須作為一個(gè)字節(jié)的數(shù)據(jù)被確認(rèn)。因此收到FIN-ACK的A必須發(fā)送一個(gè)ACK。
具有如下特點(diǎn):
- 序列號(hào) 設(shè)為出站數(shù)據(jù)的當(dāng)前序列號(hào)FSN1+1
- 確認(rèn)號(hào)字段被設(shè)為比對端B發(fā)送的最終序列號(hào)多1的值FSN2+1
- 設(shè)置ACK標(biāo)志。
ftp客戶端關(guān)閉FTP會(huì)話的Fin-ack段的ACk
當(dāng)來自A的ACK被B接收后,TCP連接上的B向A發(fā)送數(shù)據(jù)的邏輯管道就會(huì)被關(guān)閉,此時(shí)經(jīng)過四次握手后,整個(gè)TCP連接才會(huì)被完整關(guān)閉。
但在有些實(shí)現(xiàn)中段二和段段三被合并。其過程就是FIN-ACK/FIN-ACK/ACK,此時(shí)中間的FIN-ACK中的ACK是對第一個(gè)FIN-ACK的確認(rèn)。
同時(shí)關(guān)閉
雙方都執(zhí)行主動(dòng)關(guān)閉也是可能的,TCP協(xié)議也允許這樣的同時(shí)關(guān)閉(simultaneous close)。雙方各發(fā)送一個(gè)FIN,兩個(gè)FIN經(jīng)過網(wǎng)絡(luò)傳送后分別到達(dá)另一端。收到FIN后,兩端發(fā)送最后的ACK。當(dāng)收到最后的A C K時(shí),關(guān)閉TCP連接.
同時(shí)關(guān)閉的報(bào)文段交換
TCP連接的復(fù)位(Reset)
TCP連接終止進(jìn)程適用于一個(gè)TCP連接的兩個(gè)管道在互相同意的情況下正常關(guān)閉。另外一種終止TCP連接的方式是通過TCP連接復(fù)位—一個(gè)具有RST(Reset)標(biāo)志的TCP段來完成。
當(dāng)一個(gè)不可調(diào)和的入站TCP段的TCP頭中存在參數(shù)問題時(shí),一個(gè)TCP連接復(fù)位就會(huì)被發(fā)送。例如,不恰當(dāng)?shù)脑碔P地址、目的IP地址或者TCP端口號(hào)都能中斷一個(gè)建立了的連接。中斷的TCP連接將丟失所有的TCP數(shù)據(jù),包括正在傳送中或者在等待被發(fā)送的緩沖區(qū)中。
TCP也用來拒絕一個(gè)TCP連接企圖,以響應(yīng)對SYN段的接收。最常見的是,SYN段中目的端口與運(yùn)行在SYN段接收者上的應(yīng)用層進(jìn)程相對應(yīng)。當(dāng)達(dá)到被允許的最大值時(shí),連接企圖就會(huì)被拒絕。下圖顯示了TCP連接復(fù)位
一個(gè)顯示SYN和RST段的TCP連接的復(fù)位
注意:當(dāng)UDP到達(dá)一個(gè)與應(yīng)用層進(jìn)程不對應(yīng)的目的端口時(shí),會(huì)產(chǎn)生一個(gè)ICMP,目的不可達(dá)-端口不可達(dá)的報(bào)錯(cuò)發(fā)送給UDP數(shù)據(jù)發(fā)送方。
抓包截圖顯示了在一臺(tái)運(yùn)行FTP客戶端和一臺(tái)非FTP服務(wù)器主機(jī)之間的包交換。幀一是一個(gè)到FTP控制端口的SYN段,幀二是連接復(fù)位。
在連接復(fù)位段中:
1.設(shè)置了RST和ACK標(biāo)志
2.序列號(hào)為0
3.確認(rèn)號(hào)比SYN段的序列號(hào)多1
4.窗口大小是0.
三 TCP連接狀態(tài)
TCP連接狀態(tài)和說明:
狀態(tài) | 說明 |
CLOSED | 不存在TCP連接 |
LISTEN | 一個(gè)應(yīng)用層協(xié)議已經(jīng)發(fā)布了一個(gè)被動(dòng)打開,并且有意接收TCP連接企圖 |
SYN SENT | 一個(gè)應(yīng)用層協(xié)議已經(jīng)發(fā)布一個(gè)主動(dòng)打開,并且發(fā)送一個(gè)SYN段 |
SYN RCVD | 一個(gè)SYN段被接收,并且一個(gè)SYN-ACK被發(fā)送 |
ESTABLISHED | 建立TCP連接的3此握手完成。現(xiàn)在數(shù)據(jù)能雙向傳輸 |
FIN WAIT-1 | 初始的關(guān)閉連接段的FIN-ACK被發(fā)送 |
FIN WAIT-2 | 響應(yīng)初始的FIN-ACK的ACK被接收 |
CLOSING | 一個(gè)FIN-ACK被接收但ACK不是針對已發(fā)送的FIN-ACK的。收到的FIN-ACK中的是針對已發(fā)送的FINA-ACK被稱為同時(shí)關(guān)閉,這時(shí)兩個(gè)TCP對等端在相同時(shí)刻發(fā)送FIN-ACK。 |
TIME WAIT | FIN- ACK已被發(fā)送并得到兩個(gè)對等端的確認(rèn),并且TCP連接終止進(jìn)程完成。一旦到達(dá)TIME WAIT狀態(tài),在連接的TCP端口能被重新使用前,TCP必須等待的時(shí)間是最大生存時(shí)間(MSL)的兩倍。MSL是在互聯(lián)網(wǎng)中一個(gè)TCP段能存在時(shí)間的最 大值,推薦是240秒。這個(gè)延遲防止一個(gè)使用相同端口的連接的TCP段與舊連接的TCP段的副本相混淆 |
CLOSE WAIT | 一個(gè)FIN-ACK被接收,并且一個(gè)FIN-ACK被發(fā)送 |
LAST ACK | 響應(yīng)FIN-ACK的ACK已被接收 |
TCP狀態(tài)變遷圖
一個(gè)TCP對等端經(jīng)過的連接狀態(tài)依賴于TCP對等端是TCP連接建立的初始化方還是TCP連接終止的初始化方。
TCP連接圖和終止圖
原文: http://ustb-618.spaces.live.com/default.aspx