tcp/ip協議是比較重要的網路協議,面試常常會被問到,在這裡我整理一下我對tcp的一些了解。
上圖是tcp報文段的首部格式:
源埠: 源機器埠號
目的埠:目的機器埠號
序列號 : 即 seq (注意是小寫,在連線時候要用到),表示當前傳送的資料是在整個檔案中的位置(第幾個位元組)
資料偏移:記錄tcp報文段,從多少個位元組後開始是資料,首部固定20,可變最多40,tcp首部最長60位元組
保留位 :暫時沒用,為以後留著
標識位:
syn: 建立連線時候需要的同步訊號,建立連線時候syn置為1
urg: 當urg為1時,傳送方tcp快取中有1標記的資料報,可以插隊,優先傳輸。
ack:0的話,確認號無效,1的話,確認號有效。
rst: 若為1,說明tcp連線出現了嚴重錯誤,必須釋放鏈結,重新建立會話。
psh:若為1,則接收方快取中的某個資料提前交給應用程式
fin:通常意味著 所建立的連線需要關閉了,準備釋放連線 fin置為1
視窗:通訊雙方在建立會話時嗎,互相通知確認,將接收快取和傳送快取的大小匹配
校驗和:檢查報文在傳輸過程中是否有丟失
緊急指標:當urg為1時才起作用。指明緊急資料在資料報內的結束位置。
選項:傳送方最大報文長度和擴大接收方滑動視窗等資訊。
tcp建立連線的3個步驟:
1:客戶a向伺服器b發起請求 : syn = 1 (要建立請求了,同步訊號置為1),ack=0(ack=0是無效的,只是標識一下),seq =x (傳送的位元組數)。此時a的狀態為 syn-sent
2:伺服器b收到 a的請求,同意此條請求。並且向客戶a返回資訊。ack =x+1(告訴a該發第x+1個位元組上的資料了),seq=y(b現在傳送的資料在完整檔案的第y個。),ack=1(ack=1,證明現在確認號ack是有效的),syn=1(同意連線,同步訊號置為1,確認號ack總是等於上一次請求的序號+1)。
3:客戶a再向伺服器b傳送一次請求。 ack=1,seq=x+1,ack=y+1 。 至此a的狀態變為established,b收到第3次請求後,狀態變為 established 。 連線建立,雙方開始通訊。
注意:為什麼a還要傳送第三次請求確認呢?即 為什麼要第3次握手?
假設是2次握手就可以建立連線,a第一次傳送了建立連線的請求,但是這條請求由於網路堵塞,遲遲沒有到達伺服器b,但是這條請求一直還在到達b的路上。
a嘗試著又傳送了一次建立連線的請求,這條請求比較順暢的在第一次請求之前到達了b,b此時向a返回資訊。此時連線建立,a的狀態成為了established。 此時,a的第一次建立連線的請求到達了b,b認為a又傳送了一次建立連線的請求,b向a返回資訊,連線已經建立,b在等待a的通訊,但是a此時的狀態是established,所以此時的a不認剛才的第一次連線,而對b置之不理,導致b一直幹等著,浪費資源。
若是3次握手,b在收到a的第一次超時連線時候,b依然向a返回資訊(第二次握手),但是a此時的狀態是established,所以此時的a不認剛才的第一次連線,a也一直不理b,一直沒有進行第三次握手,此時b就認為此時的連線是異常的,也不會幹等著a的回應,所以就釋放掉了異常的連線。
1:客戶a認為連線需要關閉了,傳送第一次關閉請求。fin=1,seq=u。(fin置為1,證明a說:我想關閉了)
2:b向a返回資訊 ack=u+1,seq=v,ack=1 (ack=1,b說我答應你,可以斷開,但是得等我處理完資料,我說斷開時候你再斷開。同時b通知應用程序a想斷開連線了,快將剩餘的資訊發完,處理現場資訊,關閉相關資源) 此時b還是可以向a傳送資料的,但是a不能向b發了。此時a狀態為半關閉狀態。
3:b在處理完資料,做好關閉連線前的準備工作了,再向a返回資訊。ack=u+1,seq=w,ack=1,fin=1。此時b的狀態也是半關閉狀態。
4:a再向b傳送最後一次資訊:ack=1,seq=u+1,ack=w+1。b收到此條請求後,b關閉了連線,狀態為closed。a的狀態為等待關閉狀態,等待2msl時間後,a沒有收到b傳來的訊息,則a就可以確定b收到了它的上一次確認關閉請求,b關閉了。此時a也closed,tcp連線正式釋放。
msl:是報文在網路上生存的最長時間,是2分鐘,2msl是4分鐘。 那麼a為什麼非要等待2msl才可以最終關閉呢?
1:如果第四次揮手資訊(ack),由於網路原因沒能順利的達到b,處於last-ack狀態的b,會以為它的上一次揮手,即圖中序號3(帶fin 和ack的資訊),a沒有收到。所以就重發一次3。a收到這個第二次的3時,會再向b傳送一次4(ack),並且開始等待2sml,正常等待最終關閉。 如果a收到b的3(fin和ack資訊)後,就向b傳送4(ack)指令,而不等待2msl,進入closed狀態,那麼可能會導致b不能確保收到最後的ack指令,b也無法進入closed狀態。
tcp 四次揮手 TCP的三次握手和四次揮手
三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...
TCP的三次握手連線和TCP四次揮手
1.tcp建立連線,三次握手 建立的tcp連線可靠的連線,必須經過三次握手建立連線才能正式通訊彼此傳輸數資料。客戶端請求服務端建立連線 第一次握手 客戶給服務傳送乙個請求報文syn,客戶端的狀態置syn sent狀態 第二次握手 服務端在收到客戶端發過來的syn請求報文後,開始給客戶端傳送ack報文...
TCP三次握手和四次揮手
一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...