tcp粗讀

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。html

tcp頭部關鍵字
  • SYN:SYN(SYNchronization)在鏈接創建時用來同步序號。當SYN=1而ACK=0時,代表這是一個鏈接請求報文。對方若贊成創建鏈接,則應在響應報文中使SYN=1和ACK=1. 所以, SYN置1就表示這是一個鏈接請求或鏈接接受報文;
  • ack:此標誌表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1, 爲1的時候表示應答域有效,反之爲0;
  • seq:Sequence Number:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據 字節在數據流中的序號;主要用來解決網絡報亂序的問題;
  • FIN: 表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據能夠傳送了,發送FIN標誌 位的TCP數據包後,鏈接將被斷開。這個標誌的數據包也常常被用於進行端口掃描。
三次握手:

客戶端A------服務端Bgit

  • 第一次握手: A-[SYN|seq]->B 客戶端向服務端發送syn標記的包,通知服務端要創建鏈接; 此過程當中服務端和客戶端均不能肯定本身是不是ok的;github

  • 第二次握手: B-[SYN|ACK|seq]->A 服務端向客戶端發送確認包SYN/ACK,表示收到前邊創建鏈接的請求; 此過程當中客戶端A收到服務端的確認包,說明客戶端接收和發送的ok的;但此時服務端並不知道本身的狀況;服務器

  • 第三次握手: A-[ack]->B 客戶端向服務端發送確認包,表示收到服務端的確認請求; 此過程當中服務端收到客戶端發來的確認包,服務端本身的接收和發送都是ok的,雙方開始通訊;三次握手完成。網絡

客戶端收到服務器的SYN+ACK報文段。而後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。 完成了三次握手,客戶端和服務器端就能夠開始傳送數據。併發

爲何必定要三次握手呢?tcp

  • 保證兩端都能清楚的知道自身的收發狀況,兩次握手的話客戶端雖然已經知道本身的收發狀況,而且也知道服務端的收發狀況,可是服務端並不知道,因此須要第三次握手;
  • 防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤;
    例如:
  • 客服端發出的第一個鏈接請求報文段並無丟失,而是在某個網絡結點長時間的滯留了,以至延誤到鏈接釋放之後的某個時間纔到達服務端。
  • 原本這是一個早已失效的報文段。但服務端收到此失效的鏈接請求報文段後,就誤認爲是客戶端再次發出的一個新的鏈接請求。因而就向客戶端發出確認報文段,贊成創建鏈接。
  • 假設不採用「三次握手」,那麼只要服務端發出確認,新的鏈接就創建了。因爲如今客戶端並無發出創建鏈接的請求,所以不會理睬服務端的確認,也不會向服務端發送數據。
  • 但服務端卻覺得新的運輸鏈接已經創建,並一直等待客戶端發來數據。這樣,服務端的不少資源就白白浪費掉了。
  • 採用「三次握手」的辦法能夠防止上述現象發生。例如剛纔那種狀況,客戶端不會服務端的確認發出確認。服務端因爲收不到確認,就知道客戶端並無要求創建鏈接。

四次揮手:

客戶端A------服務端Bui

  • 第一次揮手:
    A-[FIN|seq|ack]->B
    客戶端已經沒有數據向服務端發送,而且向客服端發起結束請求;此時客戶端進入fin_wait_1階段 fin_wait_1:第一次等待結束態;標明客戶端主動發起結束鏈接的請求.net

  • 第二次揮手: B-[ack]->A 服務端收到客戶端結束的請求(此時可能服務端還有數據發送給客戶端),無論當前狀態如何,立馬向客戶端發送已經收到客戶端結束請求的確認信息; 注意:若是不發送的話,客戶端長時間收不到確認消息,會認爲以前發送失敗,致使從新發送結束請求; 此時客戶端收到服務端的確認信息進入fin_wait_2階段 fin_wait_2:第二次等待結束態;標明服務端已經接收到客戶端的結束請求,而且客戶端已經收到確認消息unix

  • 第三次揮手: B-[FIN|seq|ack]->A 服務端向客戶端發送結束鏈接的請求,表示服務端已經沒有數據向客戶端發送,能夠結束請求;而服務端則進入close_wait階段 close_wait: 等待關閉態;服務端發起結束鏈接請求,等待客戶端的確認信息

  • 第四次揮手: A-[ack]->B 客戶端收到服務端結束鏈接請求,向服務端發出確認關閉的請求,並進入time_wait階段; 服務端接收到請求則關閉鏈接; 客戶端等待2MSL後依然沒有收到回覆,說明服務端已經正常關閉,此時客戶端本身關閉鏈接; time_wait: 表示收到了對方的FIN報文,併發送出了ACK報文,就等2MSL後便可回到CLOSED可用狀態了。 注意:若是fin_wait_1狀態下,收到了對方同時帶FIN標誌和ACK標誌的報文時,能夠直接進入到time_wait狀態,而無須通過fin_wait_2狀態 此時,四次揮手結束。

參考:

關於TCP協議,我想你應該懂了!

通俗大白話來理解TCP協議的三次握手和四次分手

TCP協議要點和難點全解

TCP三次握手鍊接及seq和ack號的正確理解

相關文章
相關標籤/搜索