簡單的做一下tcp傳輸的過程分析(linux下),以加深自己的記憶,如有不足之處,希望各位道友能夠指出,謝謝!
tcp連線傳輸分三步:
三步握手建立連線
資料傳輸
四步揮手斷開連線
一、三步握手連線
在服務端已經完成bind listen等開啟監聽服務從而阻塞於accept()下(簡單的情況),客戶端connect()服務端:傳送乙個syn資料報建立連線, 資料報ip頭中包含syn及一些常見的選項如mss、window size等,此時客戶端:syn_sent;
客戶端接收到服務端的資料報,狀態:syn_sent---->established, connect()返回,而後傳送ack回應包,表示接收到了服務端的syn包。而後服務端接收到此包,狀態:syn_revd--->established, accept()返回,至此,連線成功建立。
二、資料傳輸
客戶端write()傳送資料,資料報ip頭包含seq序號
服務段接收到這個資料報後,傳送ack把確認接收到了資料報
三、四步揮手斷開鏈結
客戶端呼叫close(),傳送fin包,請求結束,此時客戶端:fin_wait_1
服務端接受到fin資料報時,傳送乙個ack包回應表示接收到此包,客戶段接收ack包,包此時客戶端:fin_wait_2,服務端:close_wait。(注:斷開鏈結不和三步連線一樣,在傳送ack包的同時也在包中設定fin標誌,是因為當接收到客戶端的fin包時,服務端可能在讀取客戶段傳送過來的資料)
服務端讀取完資料之後,傳送fin包請求斷開連線,客戶端接受此包 ,此時服務端:last_ack, 客戶端:time_wait
客戶端傳送ack包回應服務端的fin包,服務端接收,狀態:closed。(注:客戶端最後的time_wait狀態是為了保證服務端能夠接受到最後ack包,服務端沒收到ack後,服務端重發fin,客戶端就能夠重發ack,即可靠的實現tcp雙全工的終止。還可允許重複的分節在網路中消逝。)
至此tcp傳輸鏈結完成。
TCP協議傳輸過程
引入動態套接字的庫檔案 include include include void main if listensocket socket af inet,sock stream,ipproto tcp invalid socket 建立套接字 serveraddr.sin family af ine...
TCP資料的傳輸過程
建立連線後,兩台主機就可以相互傳輸資料了。如下圖所示 上圖給出了主機a分2次 分2個資料報 向主機b傳遞200位元組的過程。首先,主機a通過1個資料報傳送100個位元組的資料,資料報的 seq 號設定為 1200。主機b為了確認這一點,向主機a傳送 ack 包,並將 ack 號設定為 1301。為了...
TCP資料的傳輸過程
tcp資料的傳輸過程建立連線後,兩台主機就可以相互傳輸資料了。如下圖所示 上圖給出了主機a分2次 分2個資料報 向主機b傳遞200位元組的過程。首先,主機a通過1個資料報傳送100個位元組的資料,資料報的 seq 號設定為 1200。主機b為了確認這一點,向主機a傳送 ack 包,並將 ack 號設...