TCP 實習筆記 - 1

image

計算曆:7e3 年 af 月 5e 日。天氣:晴。在 Chrome 實習的第一天。緩存

終於擺脫學校開始在 Chrome 實習啦,真是不錯的一天,網絡很好,沒有丟包狀況出現,現實的狀況也沒老師說的那麼糟糕嘛。網絡

前輩的工做臺也太炫酷了吧,就是不知道在 FireFox 實習的同窗怎麼樣,IE 那的同窗,估計是手動操做吧!哈哈!!tcp

今天用這工做臺發了很多報文,工做臺用起來比學校裏手動操做報文快了很多,但基礎不能忘,今天沒什麼須要記錄的,就複習下 TCP 報文基礎吧。spa

TCPTransmission Control Protocol,傳輸控制協議,傳輸層的一個協議,其目的爲:在複雜網絡狀況下(不可靠的 IP 協議下),提供一個可靠的字節流傳輸通道。指針

可靠意味着數據的完整,也就是,在網絡連通的狀況下,排除一切可能的錯誤,將應用層的數據完完整整的發送到對方的應用層。code

那麼如何排除錯誤,對於未到達對方的報文(包括可能已經到達但對方未返回確認的),進行不斷的重發!直到對方確認收到爲止。blog

OK 如今先過一過基礎。進程

組成

首先,先複習下報文的組成:資源

TCP 報文

一個完整的報文包含以上信息,按照順序有以下做用:rem

區域 佔用字節 含義
源端口 16 TCP 通道所在進程的端口號,也就是個人工做間的門牌號。
目標端口 16 TCP 通道另外一側進程所在的端口號,估計也是和我同樣的工做間。
序號 32 當前報文中所攜帶數據中第一個字節的序號,對方會根據該序號進行數據的拼接,號碼是多少不重要,重要的是要連續。
確認序號 32 確認報文中使用,告知對方該序號前的報文已成功接收。
數據偏移 4 因爲 TCP 首部長度不肯定,對方根據該字段就能夠知道 TCP 首部長度。
保留位 6 目前未使用,置 0 便可。
URG 1 緊急標誌位,標誌該報文是否須要優先處理,主要是對本身這邊的進程起做用。
ACK 1 代表當前爲確認報文,告知對方確認序號以前的數據已完整接收。
PSH 1 推送標誌位,通知進程將將緩存區的數據推送出去。
RST 1 通道重置標誌位,通知對方重置 TCP 通道。
SYN 1 同步標誌位,通知對方開啓 TCP 通道。
FIN 1 結束標誌位,通知對方請求單向關閉 TCP 通道。
窗口 16 告訴對方,本身目前還有多少的緩存區可使用,避免 TCP 報文由於沒有緩衝區而不接受的狀況。
校驗和 16 驗證當前數據的完整性,由己方生成,並在對方校驗。
緊急指針 16 URG 配合使用,標誌緊急數據的大小。
選項 不固定 一些其餘選項,爲 TCP 發展後的一些補充。
填充 不固定 使得 TCP 報文首部長度爲 32 的整數倍。
數據 不固定 須要傳輸的數據。

其中選項中還有很多內容,下次主要複習這塊,這裏先過。

鏈接與釋放

TCP 既然表現爲一個通道,那麼通道的鏈接與釋放固然是重中之重。

※ 三次握手。

網絡是個複雜的環境,一個穩定的通道須要雙方都清楚對方已經本身發送和接收的能力,這就是三次握手的由來。

第一次握手(客戶端請求創建鏈接):

* 客戶端發送能力 客戶端接收能力 服務端發送能力 服務端接收能力
客戶端 × × × ×
服務端 × ×
  • 客戶端:雖然客戶端發送了請求,但卻不清楚本身是否真的將報文發送到了服務端,所以客戶端並不知道本身和對方的能力。
  • 服務端:服務端接收到了報文,就能知道客戶端有能力發送,本身有能力接收。

第二次握手(服務端收到報文,確認鏈接並請求鏈接):

* 客戶端發送能力 客戶端接收能力 服務端發送能力 服務端接收能力
客戶端
服務端 × ×
  • 客戶端:若返回的報文經過驗證,說明本身有能力發送服務端有能力接收,接收成功說明本身有能力接收,服務端有能力發送。
  • 服務端:和第一次握手同樣,服務端雖然發了報文,但殊不知道報文是否能正確到達。

第三次握手(客戶端收到報文,確認鏈接):

  • | 客戶端發送能力 | 客戶端接收能力 | 服務端發送能力 | 服務端接收能力
客戶端
服務端
  • 客戶端:在第二次握手過程當中,客戶端就已經確認雙方的能力,
  • 服務端:與第二次握手的客戶端同樣,若報文經過驗證,說明本身有能力發送客戶端有能力接收。

至此一個穩定的通道創建成功。

※ 四次揮手

通道的創建須要消耗計算機資源,所以當數據傳輸完畢後,如何進行釋放,也是重要的一環。

如何正確的關閉通道,是咱們須要思考的問題。

一個通道的關閉,和開啓同樣,一個巴掌拍不響,須要雙方都進行確認。

  • 第一次揮手:客戶端請求關閉鏈接。
  • 第二次揮手:服務端確認客戶端的關閉請求。
  • 第三次揮手:服務端請求關閉鏈接。
  • 第四次揮手:客戶端確認服務端的關閉請求。

通過四次揮手,通道在雙方都知曉的狀況下銷燬,而不會出現一方銷燬另外一方卻仍存在的狀況,計算機資源也可獲得相應的釋放。

那麼爲什麼不能像創建通道同樣,只進行三次?

很簡單,通道的開啓是雙方同時開啓,而關閉卻不是,當客戶端關閉了通道,僅僅表明客戶端不發送數據了,而服務端卻能夠繼續發送數據,客戶端仍能夠接收數據。

小結

通道的開啓與關閉,實際上是相同的,須要 4 個步驟

  1. 一端請求開啓/關閉
  2. 另外一端確認開啓/關閉
  3. 另外一端請求開啓/關閉
  4. 一端確認開啓/關閉

只不過通道的開啓過程當中,第 2 步和第 3 步進行了合併。

OK 整理的差很少,這些是基礎,也是最重要的部分,雖然前輩的工做臺會幫忙作掉這些步驟,但萬一機器出故障了呢,做爲 TCP 學院的優等生,我要確保數據始終能到達服務端!!

對了!前輩的工做臺仍是有一些東西沒有用到,那個大屏幕上的信息還沒充分了解,不過也瞭解個大概了,明天在去仔細研究研究。

相關閱讀

相關文章
相關標籤/搜索