- 相關(guān)推薦
TCP/IP協(xié)議是什么
TCP和UDP處在同一層---運輸層,但是TCP和UDP最不同的地方是,TCP提供了一種可靠的數據傳輸服務(wù),TCP是面向連接的,也就是說(shuō),利用TCP通信的兩臺主機首先要經(jīng)歷一個(gè)“撥打電話(huà)”的過(guò)程,等到通信準備結束才開(kāi)始傳輸數據,最后結束通話(huà)。所以TCP要比UDP可靠的多,UDP是把數據直接發(fā)出去,而不管對方是不是在收信,就算是UDP無(wú)法送達,也不會(huì )產(chǎn)生ICMP差錯報文,這一經(jīng)時(shí)重申了很多遍了。
把TCP保證可靠性的簡(jiǎn)單工作原理:
應用數據被分割成TCP認為最適合發(fā)送的數據塊。這和UDP完全不同,應用程序產(chǎn)生的 數據報長(cháng)度將保持不變。由TCP傳遞給IP的信息單位稱(chēng)為報文段或段
當TCP發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認收到這個(gè)報文段。如果不能 及時(shí)收到一個(gè)確認,將重發(fā)這個(gè)報文段.
當TCP收到發(fā)自TCP連接另一端的數據,它將發(fā)送一個(gè)確認。這個(gè)確認不是立即發(fā)送,通常將推遲幾分之一秒.
TCP將保持它首部和數據的檢驗和。這是一個(gè)端到端的檢驗和,目的是檢測數據在傳輸 過(guò)程中的任何變化。如果收到段的檢驗和有差錯, T P將丟棄這個(gè)報文段和不確認收到此報文段(希望發(fā)端超時(shí)并重發(fā))。
既然TCP報文段作為IP數據報來(lái)傳輸,而IP數據報的到達可能會(huì )失序,因此TCP報文段 的到達也可能會(huì )失序。如果必要, TCP將對收到的數據進(jìn)行重新排序,將收到的數據以正確的順序交給應用層。
TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區所能接納的數據。這將防止較快主機致使較慢主機的緩沖區溢出。
從這段話(huà)中可以看到,TCP中保持可靠性的方式就是超時(shí)重發(fā),這是有道理的,雖然TCP也可以用各種各樣的ICMP報文來(lái)處理這些,但是這也不是可靠的,最可靠的方式就是只要不得到確認,就重新發(fā)送數據報,直到得到對方的確認為止。
TCP的首部和UDP首部一樣,都有發(fā)送端口號和接收端口號。但是顯然,TCP的首部信息要比UDP的多,可以看到,TCP協(xié)議提供了發(fā)送和確認所需要的所有必要的信息?梢韵胂笠粋(gè)TCP數據的發(fā)送應該是如下的一個(gè)過(guò)程。
雙方建立連接
發(fā)送方給接受方TCP數據報,然后等待對方的確認TCP數據報,如果沒(méi)有,就重新發(fā),如果有,就發(fā)送下一個(gè)數據報。
接受方等待發(fā)送方的數據報,如果得到數據報并檢驗無(wú)誤,就發(fā)送ACK(確認)數據報,并等待下一個(gè)TCP數據報的到來(lái)。直到接收到FIN(發(fā)送完成數據報)
中止連接
可以想見(jiàn),為了建立一個(gè)TCP連接,系統可能會(huì )建立一個(gè)新的進(jìn)程(最差也是一個(gè)線(xiàn)程),來(lái)進(jìn)行數據的傳送
--
TCP協(xié)議
TCP是一個(gè)面向連接的協(xié)議,在發(fā)送輸送之前 ,雙方需要確定連接。而且,發(fā)送的數據可以進(jìn)行TCP層的分片處理。
TCP連接的建立過(guò)程 ,可以看成是三次握手 。而連接的中斷可以看成四次握手 。
1.連接的建立
在建立連接的時(shí)候,客戶(hù)端首先向服務(wù)器申請打開(kāi)某一個(gè)端口(用SYN段等于1的TCP報文),然后服務(wù)器端發(fā)回一個(gè)ACK報文通知客戶(hù)端請求報文收到,客戶(hù)端收到確認報文以后再次發(fā)出確認報文確認剛才服務(wù)器端發(fā)出的確認報文(繞口么),至此,連接的建立完成。這就叫做三次握手。如果打算讓雙方都做好準備的話(huà),一定要發(fā)送三次報文,而且只需要三次報文就可以了。
可以想見(jiàn),如果再加上TCP的超時(shí)重傳機制,那么TCP就完全可以保證一個(gè)數據包被送到目的地。
2.結束連接
TCP有一個(gè)特別的概念叫做half-close,這個(gè)概念是說(shuō),TCP的連接是全雙工(可以同時(shí)發(fā)送和接收)連接,因此在關(guān)閉連接的時(shí)候,必須關(guān)閉傳和送兩個(gè)方向上的連接?蛻(hù)機給服務(wù)器一個(gè)FIN為1的TCP報文,然后服務(wù)器返回給客戶(hù)端一個(gè)確認ACK報文,并且發(fā)送一個(gè)FIN報文,當客戶(hù)機回復ACK報文后(四次握手),連接就結束了。
3.最大報文長(cháng)度
在建立連接的時(shí)候,通信的雙方要互相確認對方的最大報文長(cháng)度(MSS),以便通信。一般這個(gè)SYN長(cháng)度是MTU減去固定IP首部和TCP首部長(cháng)度。對于一個(gè)以太網(wǎng),一般可以達到1460字節。當然如果對于非本地的IP,這個(gè)MSS可能就只有536字節,而且,如果中間的傳輸網(wǎng)絡(luò )的MSS更加的小的話(huà),這個(gè)值還會(huì )變得更小。
4.客戶(hù)端應用程序的狀態(tài)遷移圖
客戶(hù)端的狀態(tài)可以用如下的流程來(lái)表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程序正常的情況下應該有的流程,從書(shū)中的圖中可以看到,在建立連接時(shí),當客戶(hù)端收到SYN報文的ACK以后,客戶(hù)端就打開(kāi)了數據交互地連接。而結束連接則通常是客戶(hù)端主動(dòng)結束的,客戶(hù)端結束應用程序以后,需要經(jīng)歷FIN_WAIT_1,FIN_WAIT_2等狀態(tài),這些狀態(tài)的遷移就是前面提到的結束連接的四次握手。
5.服務(wù)器的狀態(tài)遷移圖
服務(wù)器的狀態(tài)可以用如下的流程來(lái)表示:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立連接的時(shí)候,服務(wù)器端是在第三次握手之后才進(jìn)入數據交互狀態(tài),而關(guān)閉連接則是在關(guān)閉連接的第二次握手以后(注意不是第四次)。而關(guān)閉以后還要等待客戶(hù)端給出最后的ACK包才能進(jìn)入初始的狀態(tài)。
6.TCP服務(wù)器設計
前面曾經(jīng)講述過(guò)UDP的服務(wù)器設計,可以發(fā)現UDP的服務(wù)器完全不需要所謂的并發(fā)機制,它只要建立一個(gè)數據輸入隊列就可以。但是TCP不同,TCP服務(wù)器對于每一個(gè)連接都需要建立一個(gè)獨立的進(jìn)程(或者是輕量級的,線(xiàn)程),來(lái)保證對話(huà)的獨立性。所以TCP服務(wù)器是并發(fā)的。而且TCP還需要配備一個(gè)呼入連接請求隊列(UDP服務(wù)器也同樣不需要),來(lái)為每一個(gè)連接請求建立對話(huà)進(jìn)程,這也就是為什么各種TCP服務(wù)器都有一個(gè)最大連接數的原因。而根據源主機的IP和端口號碼,服務(wù)器可以很輕松的區別出不同的會(huì )話(huà),來(lái)進(jìn)行數據的分發(fā)。
TCP的交互數據流
對于交互性要求比較高的應用,TCP給出兩個(gè)策略來(lái)提高發(fā)送效率和減低網(wǎng)絡(luò )負擔:(1)捎帶ACK。(2)Nagle算法(一次盡量多的發(fā)數據)
捎帶ACK的發(fā)送方式
這個(gè)策略是說(shuō),當主機收到遠程主機的TCP數據報之后,通常不馬上發(fā)送ACK數據報,而是等上一個(gè)短暫的時(shí)間,如果這段時(shí)間里面主機還有發(fā)送到遠程主機的TCP數據報,那么就把這個(gè)ACK數據報“捎帶”著(zhù)發(fā)送出去,把本來(lái)兩個(gè)TCP數據報整合成一個(gè)發(fā)送。一般的,這個(gè)時(shí)間是200ms?梢悦黠@地看到這個(gè)策略可以把TCP數據報的利用率提高很多。
Nagle算法
上過(guò)bbs的人應該都會(huì )有感受,就是在網(wǎng)絡(luò )慢的時(shí)候發(fā)貼,有時(shí)鍵入一串字符串以后,經(jīng)過(guò)一段時(shí)間,客戶(hù)端“發(fā)瘋”一樣突然回顯出很多內容,就好像數據一下子傳過(guò)來(lái)了一樣,這就是Nagle算法的作用。
Nagle算法是說(shuō),當主機A給主機B發(fā)送了一個(gè)TCP數據報并進(jìn)入等待主機B的ACK數據報的狀態(tài)時(shí),TCP的輸出緩沖區里面只能有一個(gè)TCP數據報,并且,這個(gè)數據報不斷地收集后來(lái)的數據,整合成一個(gè)大的數據報,等到B主機的ACK包一到,就把這些數據“一股腦”的發(fā)送出去。雖然這樣的描述有些不準確,但還算形象和易于理解,我們同樣可以體會(huì )到這個(gè)策略對于低減網(wǎng)絡(luò )負擔的好處。
在編寫(xiě)插口程序的時(shí)候,可以通過(guò)TCP_NODELAY來(lái)關(guān)閉這個(gè)算法。并且,使用這個(gè)算法看情況的,比如基于TCP的X窗口協(xié)議,如果處理鼠標事件時(shí)還是用這個(gè)算法,那么“延遲”可就非常大了。
【TCP/IP協(xié)議是什么】相關(guān)文章:
對TCP/IP網(wǎng)絡(luò )協(xié)議的深入淺出歸納03-15
OSI七層與TCP/IP五層網(wǎng)絡(luò )架構詳解03-05
查找本地IP/網(wǎng)絡(luò )IP/對方IP地址圖文教程04-01
手機修改ip地址方法03-08
淺談手游小眾IP的玩法實(shí)例03-06
如何使用網(wǎng)絡(luò )中靜態(tài)IP地址03-22
路由器的IP地址怎么查找03-04