上次大概的說了一下客戶端和web伺服器的互動.
這一次記錄一下客戶端和web伺服器的連線和相互收發資料的具體流程.
為了看清楚連線的具體流程,我們先來看看tcp頭部的具體格式
欄位名稱
長度(位元)
含義傳送方埠 號
16傳送網路包的程式的埠
接收方埠號
16網路包接收方程式的埠
序號 (傳送資料的順序編號)
32傳送方告知接收方該網路包傳送的資料相當於所有傳送資料的第幾個位元組
ack號(接受資料的順序編號)
32接收方告知傳送方已經收到了所有資料的第幾個位元組
資料偏移量
4表示資料部分的起始位置,也可以認為表示頭部的長度保留6
未使用控制位
6urg:表示緊急指標字段有效
ack:表示接受資料序號字段有效,一般表示資料已經被接收方收到
psh:通過flush操作傳送的資料
rst:強制斷開連線,用於異常中斷的情況
syn:傳送方和接收方相互確認序號,表示連線操作
fin:表示斷開連線
視窗16
接收方告知傳送方視窗大小
校驗和16
檢查是否出現錯誤
緊急指標
16表示應急處理的資料位置
當乙個tcp頭部填充完畢後,會將tcp頭部傳送給網路層,網路層經過一系列處理,在加上ip後就可以進行傳送,嘗試連線了.當網路包到達伺服器時,首先會匹配埠號 – 用自己tcp中的接收方埠號進行 埠號匹配.
上面寫了tcp頭部的序號字段用於傳送資料的順序編號,肯定的是–這個編號不能是固定值, 因為如果是固定值,會有機率被別人識別.對於資料不安全. 所以第一次傳送請求連線之前,需要給定乙個隨機數作為序號值. 然後伺服器收到後 會返回乙個 ack 值,用於資料確認,不僅傳送ack 值,伺服器也要傳送乙個序號值,用於 客戶端 資料確認. 當 客戶端收到 伺服器的 ack值和 序號值,客戶端也會返回乙個ack號用於確認資料. -------當這個操作完成後,則代表連線已經完成.
當遊覽器獲得使用者的輸入後,就要向web伺服器傳送自己所需要的資訊.
先分析在客戶端這邊的操作:
首先,當協議棧收到資料並不是立即傳送出去,而是先將資料存放在內部的傳送緩衝區中.然後在交由協議棧傳送出去.
問題來了:
協議棧是什麼時候將資料傳送出去的呢?
協議棧是怎樣判斷你的資料有沒有寫完?
假設:(1)
協議棧是已接收到資料時就開始傳送,接受一點,傳送一點.
這樣的話,每次傳送一點資料,會傳送大量的資料報,從而造成網路堵塞.
假設:(2)
協議棧是接受一定的資料,達到這個資料量後 開始傳送,這樣就不會造成網路堵塞.
如果資料就只有一點,不夠傳送,協議棧就一直在等待資料,不會將資料傳送出去.
假設:(3)
協議棧中有乙個定時器,每當一定時間後,就會將資料傳送出去,這樣既不會造成網路堵塞,也不會造成資料傳送不出去.
那麼這個時間就是乙個關鍵值了.
然後我們將假設(2)和假設(3) 結合起來,剛好解決這個傳送資料的問題.
用乙個定長緩衝區 + 乙個定時器.
那麼,這個時間是怎樣來判斷的呢?
其實,這個時間沒有最準確的答案,因為不同的緩衝區長度和 資料的型別不確定. 在每一種型別下都有乙個最佳 時間值.
所以 這個時間在不同的 協議棧中的 值是不同的.
這時,又有乙個問題來了. 如果有乙個資料長度 超過了緩衝區怎麼辦? 因為你緩衝區是定長的,總有乙個資料的長度超過緩衝區的長度. 這時候如何處理?
這裡我們引進 2 個概念. 乙個網路包 由包頭和訊息體組成.
包頭一般儲存 收發放的埠號,序號,ack號,視窗大小 …
mtu: 乙個網路包的最大長度
mss:去掉頭部後,乙個網路報所能容納的tcp資料的最大長度
協議棧首先會對 資料進行拆分,將乙個大資料拆分為 多個網路傳送過去.這樣就解決了無法傳送大型資料報了.
問題又來了(總是問題~ ~ ~)
如果將乙個大的資料進行拆分,網路包在資料傳輸過程中有快有慢,那麼接收方怎樣判斷接收過來的網路包的順序呢?
例如: 我們將乙個字串進行拆分傳送, —「hello」 ----> 傳送為 h e l l o .
但是接收方接受的卻是 「h l l e o」, 這樣豈不是改變了資料?
這時候 包頭起作用了.包頭中有乙個值 – 序號,它就是傳送資料的順序編號.
比如 h 的序號為 1
e 的序號為 2
l 的序號為 3 …
然後接收方按照順序排列,組合資料.
除此之外,tcp協議 還有乙個特點就是可以找回丟失的包.
當網路堵塞,或者網路不穩定難免出現丟包現象.那 tcp 是通過什麼判定是否丟包了呢?
還是包頭中的資訊.包頭中的 ack號. 就是通過序號和ack號來確定是否丟包了.
就是通過: 序號 + 資料長度 = ack號.(當然這個過程也是很複雜的,後面再詳細分析)
如果ack號中間有缺失,就代表已經丟包了.這是 接收方就會通知傳送方 重新發包.
網路之旅 三
上一節是站在伺服器和客戶端的角度講收發包的.這次我們站在包的角度上再看一下乙個包的一生 乙個包被建立的過程 有這個表就可以看出 乙個完整的包其實就是在資料報前加了三個包頭.概述乙個包的一生 當乙個包在 ip 協議處進行最後的包裝後,它就開始了自己的旅程.遺憾的是 包 也不知道他的旅程會是怎樣的.為什...
湖南之旅 二
沒搞錯吧,6點30起床,我上班都沒這麼早喲 起來吃早點,真沒搞頭,不好吃.有一些東西都是沒見過的,都叫不出名,只是嘗一下味道.那個味道真不好吃,什麼味道都講不出來.吃了飯要到那個黃石賽去,海拔1092公尺,不知道有沒有記錯.沒搞錯吧,還叫我自己爬上去,真是的.要想想下午還要徒步7.5公里喲.我最後選...
Mono 學習之旅二
對mono的簡介有了些簡介以後,我們來認識mono 中 常見的命名空間 主要的概覽 system 這個系統的命名空間基本的執行時基本的型別,包含物件,int32和字串類system.collections 這個命名空間下包含了集合的資料結構,包含list,hashtable,queue 佇列 和st...