TCP協(xié)議詳解(理論篇)
本文關(guān)鍵詞:tcp協(xié)議,由筆耕文化傳播整理發(fā)布。
> 網(wǎng)絡(luò)協(xié)議 > 正文 tcp協(xié)議詳解(理論篇) 2012-08-20 作者:陳立龍 我要投稿
tcp協(xié)議詳解(理論篇)
1. 與UDP不同的是,TCP提供了一種面向連接的、可靠的字節(jié)流服務(wù)。面向連接比較好理解,就是連接雙方在通信前需要預(yù)先建立一條連接,這猶如實際生活中的打電話。助于可靠性,tcp協(xié)議中涉及了諸多規(guī)則來保障通信鏈路的可靠性,總結(jié)起來,主要有以下幾點:
(1)應(yīng)用數(shù)據(jù)分割成TCP認為最適合發(fā)送的數(shù)據(jù)塊。這部分是通過“MSS”(最大數(shù)據(jù)包長度)選項來控制的,通常這種機制也被稱為一種協(xié)商機制,MSS規(guī)定了TCP傳往另一端的最大數(shù)據(jù)塊的長度。值得注意的是,MSS只能出現(xiàn)在SYN報文段中,若一方不接收來自另一方的MSS值,則MSS就定為536字節(jié)。一般來講,在不出現(xiàn)分段的情況下,MSS值還是越大越好,這樣可以提高網(wǎng)絡(luò)的利用率。
(2)重傳機制。設(shè)置定時器,等待確認包。
(3)對首部和數(shù)據(jù)進行校驗。
(4)TCP對收到的數(shù)據(jù)進行排序,然后交給應(yīng)用層。
(5)TCP的接收端丟棄重復(fù)的數(shù)據(jù)。
(6)TCP還提供流量控制。(通過每一端聲明的窗口大小來提供的)
2. TCP包的首部:
(1) 若不計選項字段,TCP的首部占20個字節(jié)。
(2) 源端口號以及目的端口號用于尋找發(fā)端和接收端的進程,一般來講,通過端口號和IP地址,可以唯一確定一個TCP連接,在網(wǎng)絡(luò)編程中,通常被稱為一個socket接口。
(3) 序號是用來標識從TCP發(fā)端向TCP接收端發(fā)送的數(shù)據(jù)字節(jié)流。
(4) 確認序號包含發(fā)送確認的一端所期望收到的下一個序號,因此,確認序號應(yīng)該是上次已經(jīng)成功收到數(shù)據(jù)字節(jié)序號加1.
(5) 首部長度指出了TCP首部的長度值,若不存在選項,則這個值為20字節(jié)。
(6) 標志位(flag):
URG: 緊急指針有效
ACK:確認序號有效
PSH:接收方應(yīng)盡快將這個報文段交給應(yīng)用層
RST:重建連接
SYN:同步序號用來發(fā)起一個連接
FIN: 發(fā)端完成發(fā)送任務(wù)(主動關(guān)閉)
【解釋】
◆ TCP提供解決方式是為了使一端告訴另外一端某些“緊急數(shù)據(jù)”已經(jīng)放置在普通的數(shù)據(jù)流中,讓接收端對緊急數(shù)據(jù)做特別處理。此時,URG位被置為1,并且16位的緊急數(shù)據(jù)被置為一個正的偏移量,通過此偏移量與TCP首部中的序號字段相加,可以得出緊急數(shù)據(jù)的最后一個字節(jié)的序號,常見的應(yīng)用有傳輸中斷鍵(在通過telnet連接過程中)。
◆ RST: 復(fù)位字段被用于當一個報文發(fā)送到某個socket接口而出現(xiàn)錯誤時,TCP則會發(fā)出復(fù)位報文段。常見出現(xiàn)的情況有以下幾種:
發(fā)送到不存在的端口的連接請求:此時對方的目的端口并沒有偵聽,對于UDP,將會發(fā)出ICMP不可達的 錯誤信息,而對于TCP,將會發(fā)出設(shè)置RST復(fù)位標志位的數(shù)據(jù)報。異常終止一個連接:正常情況下,通過發(fā)送FIN去正常關(guān)閉一個TCP連接,但也有可能通過發(fā)送一個復(fù)位 報文段去中途釋放掉一個連接。在socketAPI中通過設(shè)置socket選 項SO_LINGER去關(guān)閉這種異常關(guān)閉的情況。
3. TCP的連接與終止過程:
(1) 三次握手:
建立一個TCP連接,必須經(jīng)歷三次握手過程,其中發(fā)送第一個SYN的一端將執(zhí)行主動打開,接收這個SYN并發(fā)回下一個SYN的另一端執(zhí)行被動打開。
(2) 四次釋放:
要釋放一個TCP連接,需要通過四次握手過程,這是由TCP的半關(guān)閉特性造成的,因為TCP連接時全雙工的,因此,需要TCP兩端要單獨執(zhí)行關(guān)閉。值得注意的是,,主動關(guān)閉的一端在發(fā)送FIN之后,依然還能正常接收對方的數(shù)據(jù),只是通知對方它已經(jīng)沒有數(shù)據(jù)需要發(fā)送了,同理,被動關(guān)閉的一端在收到FIN之后,仍然可以發(fā)送數(shù)據(jù),直到它自身同樣發(fā)出FIN之后,才停止發(fā)送數(shù)據(jù)。
(3) TCP連接的超時問題:
完成一個TCP連接,中間涉及到一個超時的問題,大多數(shù)伯克利系統(tǒng)的超時時限為75s,Solaris9的超時時限為240s,因此,一般認為是在75-240之間。
【引申】在具體的實現(xiàn)中,如何由用戶自己去完成設(shè)置socket連接超時時間?
【解決方法】目前實現(xiàn)socket超時連接主要是通過select來完成的。具體步驟如下:
◆ 建立socket
◆ 將socket設(shè)置為非阻塞模式(若是阻塞模式,那么時間設(shè)置就毫無意義)
◆ 調(diào)用connect去進行連接
◆ 使用select檢查socket是否可寫,并同時判斷其結(jié)果(為什么是可寫?因為需要檢測socket是否收到ACK。)
◆ 將socket轉(zhuǎn)化為阻塞模式
(4)TCP的半關(guān)閉
所謂“半關(guān)閉”,是指連接的一端在結(jié)束它的發(fā)送之后還能接收到對方發(fā)過來的數(shù)據(jù)的能力。具體表現(xiàn)在,當完成三次握手的雙方,其中有一端發(fā)出FIN,此時它將進入半關(guān)
閉狀態(tài),此時它關(guān)閉了自身的發(fā)送功能,但是它依然可以接收到對方的數(shù)據(jù),如對方發(fā)過來的ACK消息。那么在實際開發(fā)中,是怎么實現(xiàn)的呢?
這牽涉到系統(tǒng)中shutdown和close函數(shù)的區(qū)別問題。
int shutdown(int s, int how)
本文關(guān)鍵詞:tcp協(xié)議,由筆耕文化傳播整理發(fā)布。
本文編號:159033
本文鏈接:http://sikaile.net/wenshubaike/xxkj/159033.html