TCP通訊協議的連線與揮手

2021-07-03 18:57:35 字數 3248 閱讀 6897

建立tcp通訊連線需要經過三次握手。初始時伺服器端處於監聽狀態,accept()處於阻塞狀態,客戶端請求連線服務端時,connect()剛剛呼叫並處於阻塞狀態

第一次握手,客戶端向服務端傳送syn、mss,客戶端處於syn_sent狀態,服務端接收後將由listen狀態變為syn_rcvd狀態。

第二次握手,服務端向客戶端傳送乙個syn、mss還有乙個ask(等於客戶端傳送的syn+1),客戶端接收syn、mss、ask核對無誤後將syn-sent狀態改為established狀態。

第三次握手,客戶端connect()返回不在處於阻塞狀態,客戶端向服務端傳送ack(等於服務端傳送的syn+1),服務端接收ack核對無誤之後,accept()從阻塞狀態返回,同時read()阻塞,連線建立。

三次握手的原因:1、防止已過期的連線再次傳到被連線的主機,比如:兩次握手時,a(選好埠)傳送連線資訊到b延遲了,a再發b接收了從而建立連線,資訊傳送完之後斷開連線,原先的請求資訊又傳到b,b認為建立連線,但a相應的埠已經斷開

2、三次握手防止死鎖:a傳送連線請求資訊到b,b認為建立連線再傳送請求資訊到a卻丟失了,a不知道連線的各個資訊不知道b已經準備好認為連線還未成功,將忽略b所發來的資訊,造成死鎖。

斷開tcp連線需要經過四次揮手。通常是客戶端主動斷開,客戶端應用程式呼叫close(fd)關閉套接字。

第一次揮手,客戶端向服務端傳送fin,客戶端處於fin-wait-1狀態,服務端接收fin將會處於close-wait()狀態同時read()return 0。

第二次揮手,服務端向客戶端傳送ack(等於客戶端傳送fin+1),客戶端接收ack後將處於fin-wait-2狀態,服務端關閉客戶端描述符close(),將未傳送完的資料丟掉。

第三次揮手,服務端向客戶端傳送fin,此時服務端處於last-ack狀態,客戶端接收fin後將由fin-wait-2狀態變為time-wait狀態。

第四次揮手

客戶端向服務端傳送ack(服務端fin+1),伺服器接收ack後核對無誤將last-ack狀態變為close狀態,連線斷開。

注:客戶端處於time-wait狀態要經歷2個msl時間才會將狀態變為close,通常等待時間為60s。

tcp的11種狀態

客戶端獨有:(1

)syn_sent (2

)fin_wait1 (3

)fin_wait2 (4

)closing (5

)time_wait

服務端獨有:(1

)listen (2

)syn_rcvd (3

)close_wait (4

)last_ack 

共有:(1

)closed (2

)established

listen :監聽來自遠方tcp埠的連線請求。

syn-sent :在傳送連線請求後等待匹配的連線請求。

syn-received :在收到和傳送乙個連線請求後等待對連線請求的確認。

established :代表乙個開啟的連線,資料可以傳送給使用者。

fin-wait-1 :等待遠端tcp的連線中斷請求,或先前的連線中斷請求的確認。

fin-wait-2 :從遠端tcp等待連線中斷請求。

close-wait :等待從本地使用者發來的連線中斷請求。

closing :等待遠端tcp對連線中斷的確認。

last-ack :等待原來發向遠端tcp的連線中斷請求的確認。

time-wait :等待足夠的時間以確保遠端tcp接收到連線中斷請求的確認。

closed :沒有任何連線狀態。

closing狀態:客戶端向服務端傳送了fin,卻沒有收到伺服器的ack,反而收到了服務端的fin。這種情況發生在伺服器向客戶端傳送的ack丟包了。

time-wait:一端發起主動關閉時,並且已經收到對方的fin,這時進入time-wait狀態,time-wait的時間是2倍的msl(最大生存時間),在time-wait狀態連線實際已經斷掉,但原埠還不能被新的連線使用。

time-wait原因:

1、防止回給對方fin的ack丟失,服務端並不會對ack做確認,只能等待一段時間寄希望服務端已經收到,如果服務端沒有收到對其傳送的fin的確認會再傳送fin,這樣客戶端就由機會再回乙個ack。2、防止上一次連線中遲到的資料報影響新的連線,在time-wait狀態這些包會被丟棄。

tcp進站(inbound)處理過程:

正常情況下,

tcp進站處理的過程。

服務端處於監聽狀態,客戶端用於建立連線請求的資料報(ip packet)按照tcp/ip協議堆疊組合成為tcp處理的分段(segment)。

分析報頭資訊

tcp層接收到相應的tcp和ip報頭,將這些資訊儲存到記憶體中。

檢查tcp校驗和(checksum):標準的校驗和位於分段之中(figure-2)。如果檢驗失敗,不返回確認,該分段丟棄,並等待客戶端進行重傳。

查詢協議控制塊(pcb{})

tcp查詢與該連線相關聯的協議控制塊。如果沒有找到,tcp將該分段丟棄並返回rst。(這就是tcp處理沒有埠監聽情況下的機制) 如果該協議控制塊存在,但狀態為關閉,服務端不呼叫connect()或listen()。該分段丟棄,但不返回rst。客戶端會嘗試重新建立連線請求。

建立新的socket:當處於監聽狀態的socket收到該分段時,會建立乙個子socket,同時還有socket{},tcpcb{}和pcb{}建立。這時如果有錯誤發生,會通過標誌位來拆除相應的socket和釋放記憶體,tcp連線失敗。如果快取佇列處於填滿狀態,tcp認為有錯誤發生,所有的後續連線請求會被拒絕。這裡可以看出syn flood攻擊是如何起作用的。

丟棄:如果該分段中的標誌為rst或ack,或者沒有syn標誌,則該分段丟棄。並釋放相應的記憶體。

tcp/ip是很多的不同的協議組成,實際上是乙個協議組,tcp使用者資料包表協議(也稱作tcp傳輸控制協議,transport control protocol。可靠的主機到主機層協議。這裡要先強調一下,傳輸控制協議是osi網路的第四層的叫法,tcp傳輸控制協議是tcp/ip傳輸的6個基本協議的一種。兩個tcp意思非相同。)。

tcp和udp通訊協議

tcp udp tcp與udp基本區別 1.基於連線與無連線 2.tcp要求系統資源較多,udp較少 3.udp程式結構較簡單 4.流模式 tcp 與資料報模式 udp 5.tcp保證資料正確性,udp可能丟包 6.tcp保證資料順序,udp不保證 udp應用場景 1.面向資料報方式 2.網路資料大...

通訊介面與通訊協議

本人是搞自動化的,以前老是將介面與協議的概念傻傻分不清楚,十分懵逼,最近豁然開朗,土地平曠啊,今天就與大家分享一下,希望能幫到大家。兩台裝置想要通訊,首先要具有相同的裝置介面,或者可以轉成相同的介面。打個比方,羊有232串列埠,牛有485串列埠,那麼顯然,羊和牛是不能通訊的,此處忽略轉介面,只是表達...

TCP通訊協議(上)同步傳輸

直接上例子,學習資料來自net之美。服務端建立listener物件,客戶端建立client物件,服務端首先開始對本地埠監聽,客戶端傳送連線請求。當需要傳輸字串時,兩者均需要建立stream物件,將想說的話,寫在這片小紅葉上,小紅葉就飛到對方 了。using system using system.c...