TCP/IP並非單獨的一個協議,而是一個協議族(TCP/IP協議族),這個協議中最核心的兩個協議是TCP(傳輸控制協議)和IP(網際協議)。算法
TCP協議是面向鏈接的通信協議
面向鏈接的會話的創建過程以下:
1.源應用程序請求一個面向鏈接的通訊會話。
2.創建會話(須要一段時間,是選用無鏈接的協議的一個緣由)。
3.在邏輯鏈接上開始數據傳輸。
4.傳輸結束時,信道解除鏈接。緩存
簡單的說面向鏈接的會話,就像打電話同樣
1.我想要跟我媽打個電話。
2.我打過去了,我媽的手機開始響,截止到我媽接電話這個動做。
3.我跟我媽說:‘媽,我沒錢了’。
4.我媽掛斷電話。服務器
其實在數據傳輸(我跟我媽說「我沒錢了」)以前和以後有不少動做,包括「想打電話,打電話,接電話,掛電話」。
而創建TCP鏈接以前須要進行三次握手,而斷開鏈接則須要四次揮手。這麼麻煩,每次數據通信的時候須要耗費的資源更多,這樣作的好處就是比較可靠,哪怕你傳輸失敗了,你也能知道--哦,我此次通信失敗了(跟UDP一個比較大的區別)。網絡
源端口和目標端口分別是本機的端口和請求服務器的端口,每一個只能16位,因此你知道爲啥端口只能65535個了嗎,別找ip了,在ip報頭裏那
序號:客戶端隨機產生的一個值,長度爲32位
確認號:是接受信息端,接受數據包以後,返回的時候把(序號+1)返回,這樣發送端就知道:這個返回的確認號=我剛纔發送的序號+1,因此這個數據是回覆個人
數據偏移:tcp報首佔了數據的X位,因此從開始日後數X位纔是你的你須要的數據,此處的X就是數據偏移
保留:保留爲從此使用,但目前應置爲0
標誌位:一共有6個,分別佔1位,共6位併發
1.緊急 URG:它告訴系統此報文段中有緊急數據,應儘快傳送,而不要按原來的排隊順序來傳送 2.確認 ACK:當ACK=1的時候,確認號有效,創建鏈接以後全部的ack都應設置爲1 3.推送 PSH (Push):當PSH =1的時候,表示該報文段高優先級,接收方 TCP 應該儘快推送給接收應用程序,而不用等到整個TCP緩存都填滿了後再交付。 4.復位 RST (Reset):當 RST = 1 的時候,表示 TCP 鏈接中出現嚴重錯誤,須要釋放並從新創建鏈接。 5.同步 SYN (SYNchronization):當 SYN = 1 的時候,代表這是一個請求鏈接報文段。通常稱攜帶 SYN 標誌的 TCP 報文段爲「同步報文段」。在 TCP 三次握手中的第一個報文就是同步報文段,在鏈接創建時用來同步序號。對方若贊成創建鏈接,則應在響應的報文段中使 SYN = 1 和 ACK = 1。 6.終止 FIN (Finis):當 FIN = 1 時,表示此報文段的發送方的數據已經發送完畢,並要求釋放 TCP 鏈接。通常稱攜帶 FIN 的報文段爲「結束報文段」。在 TCP 四次揮手釋放鏈接的時候,就會用到該標誌
窗口大小 Window Size:該字段明確指出瞭如今容許對方發送的數據量.
校驗和 TCP Checksum:由發送端填充,接收端對 TCP 報文段執行 CRC 算法,以檢驗 TCP 報文段在傳輸過程當中是否損壞,若是損壞這丟棄。
緊急指針 Urgent Pointer:僅在 URG = 1 時纔有意義,它指出本報文段中的緊急數據的字節數。當 URG = 1 時,發送方 TCP 就把緊急數據插入到本報文段數據的最前面,而在緊急數據後面的數據還是普通數據。tcp
LISTENING狀態:偵聽(LISTENING)狀態
ESTABLISHED狀態:創建鏈接。表示兩臺機器正在通訊
CLOSE_WAIT:對方主動關閉鏈接或者網絡異常致使鏈接中斷,這時我方的狀態會變成CLOSE_WAIT 此時我方要調用close()來使得鏈接正確關閉
TIME_WAIT:我方主動調用close()斷開鏈接,收到對方確認後狀態變爲TIME_WAIT。處於TIME_WAIT狀態的鏈接佔用的資源不會被內核釋放
CLOSED:初始狀態,表示沒有任何鏈接
TIME_WAIT: 表示收到了對方的FIN報文,併發送出了ACK報文,就等2MSL後便可回到CLOSED可用狀態了
CLOSING:當兩端都主動發送FIN的時候,而且在收到對方對本身發送的FIN以前收到了對方發送的FIN的時候,兩邊就都進入了CLOSING狀態,只要收到了對方對本身的FIN的ACK,就能夠雙雙進入TIME_WAIT狀態工具
1.第一次握手:創建鏈接。客戶端發送鏈接請求報文段,發送的SYN位置爲1,序號(Sequence Number)爲x;而後,客戶端進入SYN_SEND狀態,等待服務器的確認;
2.第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,須要對這個SYN報文段進行確認,設置確認號(Acknowledgment Number)爲x+1(Sequence Number+1);同時,本身本身還要發送SYN請求信息,將SYN位置爲1,序號(Sequence Number)爲y;服務器端將上述全部信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態;
3.第三次握手:客戶端收到服務器的SYN+ACK報文段。而後將確認序號(Acknowledgment Number)設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。
完成了三次握手,客戶端和服務器端就能夠開始傳送數據spa
1.第一次揮手:主機1(可使客戶端,也能夠是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了;
2.第二次分手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number爲Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我「贊成」你的關閉請求
3.第三次揮手:主機2向主機1發送FIN報文段,請求關閉鏈接,同時主機2進入CLOSE_WAIT狀態;
4.第四次揮手:主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,而後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段之後,就關閉鏈接;此時,主機1等待2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,主機1也能夠關閉鏈接了。
至此,TCP的四次揮手就這麼愉快的完成了3d
圖片描述
這個是兩個通信方同時發起結束的狀況
1.主機A,設置Sequence Number和Acknowledgment Number,向主機B發送一個FIN報文段;此時,主機A進入FIN_WAIT_1狀態;這表示主機A沒有數據要發送給主機B了,於此同時第二部正在進行,接收到主機B發過來的申請斷開鏈接的請求,進入CLOSING;
2.主機B,設置Sequence Number和Acknowledgment Number,向主機A發送一個FIN報文段;此時,主機B進入FIN_WAIT_1狀態;這表示主機B沒有數據要發送給主機A了,以後接收到主機A發過來的申請斷開鏈接的請求,主機B也進入CLOSING
3主機A贊成主機B提出的斷開申請的要求,同時接受到主機B贊成斷開申請的要求,主機A狀態變爲TIME_WAIT
4--跟第三步同樣指針
widnows下抓包工具抓到的數據包和tpc報頭的對應