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