TCP是什麼面試
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向鏈接(鏈接導向)的、可靠的、 基於IP的傳輸層協議。服務器
TCP有6種標示:SYN(創建聯機) ACK(確認) PSH(傳送) FIN(結束) RST(重置) URG(緊急)網絡
TCP的三次握手tcp
第一次握手:客戶端向服務器發送請求報文,這時報文首部中的同部位SYN=1,並生成一個隨機序列值seq=n。客戶端進入syn-sent(同步已發送)狀態,等待服務器確認server
第二次握手:TCP服務器收到請求報文後,若是贊成鏈接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號ACK=n+1,同時本身也隨機生成一個seq=m,此時服務器進入SYN-RCVD(同步收到)狀態。blog
第三次握手:TCP客戶端進程收到確認後,還要向服務器給出確認。確認報文的ACK=1,ack=m+1,進程
TCP的三次握手抓包資源
使用nc -l localhost 8088 監聽8088端口同步
客戶端使用nc -v localhost 8088 鏈接8088端口io
再開個終端使用 tcpdump -i lo -vv -nnn tcp port 8088 抓包8088 端口tcp鏈接
抓包數據
爲何須要三次握手
端口 client發送了一個請求鏈接的報文,可是網絡很差,這個請求沒有當即達到服務端,客戶端沒有收到服務器的確認消息後,任務該請求報文已失效了,可是過了一會以後server收到報文,仍是會像client發送確認的報文,表示贊成鏈接。若是這裏不用三次握手,那麼只要server發出確認報文,新的鏈接就
創建了,但其實這個請求client已經任務失效了,不會理睬server的確認信息,也不會像服務器發出確認的請求,可是server的請求已經創建了,並一直等待client的數據,這樣會浪費server的資源,採用三次握手就是爲了防止這種狀況的發生,server會由於收不到確認的報文,而不會創建鏈接。
舉個列子:就比如找工做的時候,你經過手機問面試官,我能去面試嗎,面試官說能夠,你收到面試官的確認,而後你在確認面試時間,那就能夠愉快的去面試了。
四次揮手
第一次揮手:TCP client發送一個FIN ,用來關閉到服務端的鏈接,client進入FIN_WAIT_1狀態
client進程發出鏈接釋放報文,而且中止發送數據。釋放報文首部,FIN=1,其序列號爲seq=x
第二次揮手:TCP server 收到FIN 後,發送一個ACK 確認,server進入CLOSE_WAIT狀態,客戶端收到ACK後會進入FIN_WAIT_2狀態
這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,可是服務器若發送數據,客戶端依然要接受
第三次揮手:TCP server 發送一個FIN,用來關閉server到client的鏈接,server進入LAST_ACK狀態。
服務器將最後的數據發送完畢
第四次揮手:TCP client收到FIN後,client進入TIME_WAIT狀態,接着發送一個ACK給server,server進入CLOSED狀態
TCP鏈接尚未釋放,必須通過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態
四次揮手抓包
開個終端使用 tcpdump -vv -nnn tcp port 80 端口tcp鏈接
再另外一個終端裏面使用抓包數據
爲何須要四次揮手
終端爲了確保數據可以徹底輸出,關閉鏈接時,當收到主動方的FIN報文通知時,它僅僅表示主動方是沒有數據須要發送了,可是被動方可能還須要發送數據,因此不會立刻關閉SOCKET。因而被動方只發送ACK確認報文,繼續發送一些數據給主動方,而後再發送FIN報文,此時就能夠關閉鏈接了
一次網頁訪問的抓包