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