1. 程式人生 > >java網絡通信:TCP協議

java網絡通信:TCP協議

交互 常用 又一 server 分享 osi七層模型 情況 來看 七層模型

  面試的時候,面試官由於需要考察一個面試人對於網絡編程的熟悉程度,往往會考察學生對於TCP、HTTP、UDP、這些常見的網絡編程當中的協議的了解程度,而TCP協議則是首當其沖的,作為進程之間通信常用的一種協議,只要崗位涉及到了進程之間的相互通信,則一定會被詢問到TCP協議,那麽本篇就來總結一下TCP協議吧~

  TCP協議在OSI七層模型當中,是屬於傳輸層的協議,它是一種可靠傳輸的協議,這個可靠,指的是TCP可以確保通信信息不會因為網絡因素導致丟包,確保接受方一定可以接受到完整的數據。在TCP可靠傳輸方面,常常與另一個協議——UDP協議進行對比,我們通過兩者的對比,先大體對TCP協議有些了解。

1.TCP和UDP的異同點

1)tcp是面向連接的,而udp則是不需要建立連接的。

2)tcp是面向字節流的,而udp則是面向數據報的。這話的理解是udp發送的報文長度是進程給出的,而TCP發送的報文長度,則是根據對方的接受窗口和當前網絡的情況決定的。可以想象TCP是按流傳輸,而udp是按一個一個報文進行傳輸的。

3)tcp是可靠傳輸,而udp是盡最大可能交付的協議,tcp的可靠傳輸主要是通過滑動窗口和發送-確認-窗口滑動機制,來確保的,而udp就是盡可能發送,不確保發送的數據是否到達的。

4)tcp是一對一的全雙工的通信,而udp可以一對一,一對多,多對一,多對多的通信。

5)tcp具有流量控制,擁塞控制機制,而udp沒有。

  從上述的比較,可以大體把握了TCP是一個什麽樣的協議,那麽接下來,我們來看看在面試當中涉及到TCP協議的話,必要考的一個考點,TCP的三次握手和四次揮手。

2.TCP的三次握手和四次揮手

  tcp是面向連接的協議,那麽兩個進程需要通過tcp進行交互的時候,需要首先建立連接,這個建立連接的過程,需要來回三次通信,所以顧名思義,被較為了三次握手,那麽這三次握手是一個什麽樣的流程?首先我們來看一下圖。

技術分享

在圖中,著重關註幾個點,Client和Server的狀態變化、標誌位的置1、發送序號的數字。

  首先我們要發起連接請求的進程稱之為Client,而被動接收連接請求的稱之為Server,Server和Client在發起連接請求之前,都會創建TBC(傳輸控制塊),這時候Server將進入監聽(Listen)狀態,而Client建立TCB之後,將發送連接請求。

  Client將要發送的TCP報文當中的SYN標誌位置1,並且在發送序號置為了x,發送到Server,這時候Client將進入SYN_SENT(同步已發送)狀態。

  Server接收到後,向Client回復一個SYN標誌位也置1,ACK標誌位置1,發送序號為:y,而確認序號為:x+1 的tcp報文,這時候Server將進入SYN_RCVD(同步接收)狀態

  Client接收到Server的回復報文之後,再回復一個ACK標誌位置1,發送序號為x+1,確認序號為:y+1 的tcp報文,這時候Client和Server都同時進入ESTABLISH狀態,連接建立。

想面試官講解完三次握手之後,面試官可能會問出一個常規的延伸問題,為什麽是三次握手,而不是兩次握手呢

  這是為了防止Client已失效的連接請求報文突然又傳到了Server,產生錯誤。舉個例子詳細來說,Client發送連接請求,但是因為連接請求的報文丟失而未收到確認,於是Client又一次重傳了一次連接請求,後來收到了確認,然後建立了連接,數據傳輸完畢後,釋放了連接。而第一個連接請求這時候到達了Server,Server收到了報文之後,誤認為Client需要再次建立連接,就會回復這個連接請求,而這時候由於實際上Client這時候並沒有發起請求,所以Client會忽略這個回復,而如果采用的是兩次握手,這時候Server就已經進入建立連接的狀態,白白的浪費了資源。而采用三次握手,Server就不會收到回復,則就表明這是一個無效的連接,就會中斷。

java網絡通信:TCP協議