TCP/IP協議簇協議概覽

從大學就開始接觸到了網絡協議,零零散散不成體系,那時也沒有理解的多麼透徹,更別談將它應用到實際。工作開始漸漸的意識到網絡基礎理論的重要性。寫博客的用意如下,整理自己的知識,查漏補缺,檢查自己還有哪些沒有理解的,畢竟基礎知識決定了以後在技術方面能走多遠;再者就是要能幫到了後來者再好不過了。自己知識有限,還望有緣人指正一二,萬分感謝。


前言:

本篇文章主要講述的是,七層協議中的物理層到傳輸層協議,對於應用層協議中DNS和HTTP會單獨的作爲一個模塊闡述,另外網絡協議精妙複雜,絕不是這一篇文章可以描述清楚的,文章難免會出現不是十分嚴謹或是不太詳細的,先建立個宏觀體系,再談些重要的細節。說明下TCP/IP協議簇不單只是TCP和IP協議。

兵馬未動糧草先行,直接上圖

 

ARP協議在四層協議中算是網絡層,但是在7層協議中應該算是鏈路層

 

簡略版TCP/IP協議簇模型

先用大白話說下OSI參考模型。
1、爲什麼要分模塊?
這就好比一個公司,會有很多部門,每個部門可以理解爲只做一個事情,一個部門可能在爲另一個部門提供服務,也可能別的部門在服務它。爭取每個部門只做一件事,就像一個函數只做一件事一樣。作爲互聯網最基礎的網絡,怎麼能全部在一起解析了,還是得分模塊,這樣纔是一個老司機該做的事。不過我覺得這種模塊的劃分還是面向了具體,而非抽象。
2、OSI完成的是什麼任務?
當然是通信任務啦,廢話我也知道,能不能具體些。舉個簡單的例子,小王在地址欄輸入www.baidu.com按下了回車鍵,這一次點擊發生了哪些內容。www.baidu.com?這是什麼鬼,我怎麼知道這是誰,他在哪了。顯然我們首先是找到這個地址在哪裏吧,這樣我們才能傳輸一些信息吧。
第一步:DNS域名解析服務器,要想使用www.baidu.com得先註冊才成,不是你輸入什麼都可以的。先不說詳細了,就知道有個DNS服務器,他就是保存鍵值對信息,如www.baidu.com對應了115.239.210.27這個地址。這個叫做IP號,它的作用就是定位,(就像你的家庭地址加上你的名字一樣,MAC地址像身份證號碼)。
第二步:知道你想要幹什麼。就是複雜的協議分裝了,先進行HTTP封裝,比如你的請求方式(GET),URL是什麼(www.baidu.com),用的什麼協議(HTTP1.1),請求的整個長度是多少。這些都知道了後,百度服務器就知道你要幹什麼了,因爲協議有自己的格式,也可以根據這些條件解析出來了。
第三步:將你的請求安全的送達到目的地的哪一個服務器處理。www.baidu.com默認是80端口,操作系統會根據端口的不同,將不同的數據給相應的進程處理。瀏覽器的端口假設爲53141.有了目標端口和本地端口,就可以知道目標進程和目標服務器也能找到自己的進程了。這時候傳輸層封裝完畢,到達了網絡層。網絡層會將自己的IP和目標的IP寫入。這樣有了IP和端口就能找到設備中的進程了。爲什麼有了IP地址就能找到目標設備了,這麼神奇。這時候網關就派上用場了,網關多是路由器的IP地址,它會根據子網掩碼判斷你是不是本地的。不是本地的就必須從網關出發,這是到外網的必經之路。你的設備通過ARP協議廣播192.168.1.1這個網關的MAC地址是多少?知道了MAC地址後,開始封裝數據鏈路層,將你的MAC地址和網關的MAC地址寫入。根據數據鏈路層判斷下一個數據包是給哪個設備,而網絡層的IP是最終的目標IP。每走一跳,數據鏈路層的目標和源MAC地址都會變。然後到達了物理層,它解決的是與硬件的關係,如大於多少伏的電壓代表1,小於多少代表0,因爲本質上電腦只識別0和1。再如,模擬信號和電信號的轉換。這樣就一步一步的到達了目標百度服務器,一步一步從物理層反過來解析,最後將消息轉給的監聽80端口的進程處理。一次簡單的過程就這樣了,百度服務器終於收到了我們的一次請求了。

封裝過程

 

問題:集線器、交換器、路由器大體是怎麼工作的?

  • 1、集線器,主要功能是對接收到的信號進行再生整形放大,以擴大網絡的傳輸距離。收到了一位bit就進行轉發,不解析不處理。
  • 2、交換器,收到字節流後,解析出數據幀,並查看目標的MAC地址,判斷出從哪個交換機口進行轉發出去。它是二層設備。
  • 3、路由器,不僅會解析出MAC地址還會解析出目標的IP,檢查是否丟棄還是轉發給下一跳哪個設備。它是三層設備。

一、網絡層

1、IP地址

衆所周知,Windows系統查詢網絡IP地址爲ipconfig,Linux中爲ifconfig或者ip addr命令。Windows如下圖所示。

ipconfig


IPv4的IP地址是32個字節的,如百度的115.239.210.27就是一個IP地址,它的作用是一個網卡的地址,具有定位作用。現在想一想MAC地址是一個網卡出廠就具備的全球唯一的地址,那麼有了MAC地址後,怎麼還需要IP地址了?答案就是沒有IP地址根本定位不了,給你一個百度的服務器MAC地址,你怎麼能找到他了。MAC地址就像我們的身份證,IP地址就如同我們的家庭住址+名字。比如給你小王的MAC地址,你也不可能找到他,只有先通過他的家庭住址和名字,才能找到他。所以說MAC地址不具備大範圍的定位作用,只有在局域網內纔有作用,這就是MAC地址和IP地址的一個區別。
32位的IP地址被分成了一下五類,又大大的減少了IP地址數量。A、B、C是有網絡號和主機號組成的。這樣是爲了區別是不是在同一個局域網內,網絡號代表的是小區,主機號代表的是哪一號房間。這樣不同的小區就可以都有1001號房間了,但不會產生衝突,因爲他們的網絡號不同。

IP地址分類


如下圖所示,A、B、C三類的最大主機數量,很容易產生浪費。私密地址代表什麼了,我們上學的時候IP都是172.16開頭的,貌似很多大學的IP都是一樣的,你會問這不是產生衝突了嗎,只能說,這些IP在局域網裏面是正常使用的,一段到了公網後,這個就會被替換成一個不衝突的IP了,數據請求返回時,再被替換回來,這樣就保證了不衝突,詳情下面會說,現在有個概念就可以了。


怎麼判斷是否是同一個局域網的IP地址了?
通過配置的子網掩碼。如下圖是一個C類的私有IP地址,網絡號爲24位,主機號位8位,廣播地址爲192.168.1.255,一般默認的網關爲192.168.1.1.將子網掩碼和IP地址按位與計算後,就可以得到網絡號了,也就可以判斷目標IP是否是要出網關了。
D類地址是組播地址,也就是說這個組的網卡都會收到改組的數據。
此外還介紹一個特殊的IP地址,127.0.0.1。他是個環回接口,這個地址用於本機通信,經過內核處理後直接返回給本機。

IPv4相關配置

 

Linux中配置IP地址如下:

sudo ifconfig eth1 192.168.1.174/24 //給eth1這個網卡配置IP和子網掩碼
sudo ifconfig eth1 up // 啓動

簡單的數據發送過程:系統會判斷數據包的目標IP是不是在同一個網段中,如果是是同一個網段,他會通過ARP協議廣播獲取目標IP的MAC地址,直接發送給目標即可。如果是跨網段,那麼獲取網關的MAC地址,把數據發給網關就不管了。

2、DHCP協議(動態路由協議)

日常生活中,我們都是插上網線就可以用了,並沒有配置IP啊。那麼這個過程就會使用到了DHCP協議,由DHCP服務器管理了IP的分配,並分給剛來的網卡一個可用的IP。
簡單說DHCP就是負責管理IP地址的,簡單。不過我所在的公司爲了可控都是採用靜態IP的。需要管理員分配IP並配置。
DHCP工作工程:
想想一個剛來的電腦怎麼才能和DHCP服務器聯繫了,畢竟它什麼也不知道,這時候廣播地址就派上用場了。新的電腦就會使用0.0.0.0這個IP地址,目的IP爲255.255.255.255.源端口爲68,目標端口爲67,發送一個UDP的廣播。這樣DHCP服務器收到了,就知道新來了一個電腦需要IP,服務器就選擇一個IP,也是通過廣播的方式發送IP、子網掩碼、網關等相關信息。這樣新的電腦會收到了一個IP地址,但是如果要是多個DHCP發送了多個IP了?新的電腦會選擇一個IP,繼續發送廣播包,告訴DHCP服務器,自己所選用的IP號和一些其他信息,當然DHCP服務器收到了廣播後,會返回給新電腦一個ACK確認包,這樣一次完整的DHCP過程纔算結束。
DHCP服務器會不僅可以動態分配IP,還可以回收IP,正所謂有借有還再借不難嘛,DHCP服務器會在租期時間結束的時候自動的回收IP該IP。但如果網卡的IP還要用該怎麼辦了?客戶端租期時間過去的時候就重新向服務器發送請求,客戶端收到服務器的返回後,就會更新新的租賃參數。

3、從物理層到數據鏈路層

開始我們就說了,物理層解決的是,如何在傳輸媒體上傳輸比特流,而不是指具體的媒體,如雙絞線、無線等,抽象的作用。通過調制解調器將電信號和模擬信號進行轉化等等。物理層完成的是對硬件層的封裝。
此外物理層還需要對數據幀再次封裝,加一個起始頭,不然怎麼知道這是不是一個數據幀了。
接下來是數據鏈路層:
先給拋幾個問題:

  • 1、數據包是誰都可以接收嗎?
  • 2、發送的時候有錯誤該怎麼辦?
  • 3、解析的時候怎麼正確的解析,而不導致錯誤,如ARP協議和IP協議格式肯定不一樣。
  • 4、發送的時候會不會有順序的問題了?

爲了解決上面幾個問題,先給出數據幀的封裝格式:

 

數據幀格式

 

第一個問題:數據包當然不是誰都可以接收的,但都在一個局域網裏面,你發送的數據肯定都能收的到,只不過不是目標網卡自動過濾了消息罷了。只有數據幀的目標MAC和自身網卡的MAC地址相匹配纔可以接收。當然這本身就是個漏洞,自己捯飭捯飭不是自己MAC的數據幀也能收到,所以在網上傳輸的數據本身就是不安全的。

第二個問題:爲了保證數據的完整值,總得有個標誌對吧。因爲在網上傳輸的過程中很有可能出現錯誤的情況。當封裝成幀發送的時候,會將數據通過算法生成一個CRC檢驗值。這樣下一跳收到的時候,也會生成該數據的CRC。如果兩者的CRC校驗值是相等的,那麼就認爲是完整的,纔會走下列流程。反之,丟棄不管了。

第三個問題:通過兩字節的類型就可以判斷此時傳輸的是什麼協議,通過標誌來代表是什麼業務。筆者在制定公司的通訊的協議時,也是通過和服務端協商將不同的標誌代表不同的業務。如果是IP數據就用IP格式的方式解析即可。

第四個問題:
當在局域網發送數據幀的時候,先偵聽信道是否空閒 ,若空閒,則立即發送數據。若信道忙碌,則等待一段時間至信道中的信息傳輸結束後再發送數據;若在上一段信息發送結束後,同時有兩個或兩個以上的節點都提出發送請求,則判定爲衝突。若偵聽到衝突,則立即停止發送數據,等待一段隨機時間,再重新嘗試。這就是CSMA/CD協議,由於衝突的認定的時間爲2T,小於2T的時間內又回來了,這說明信道空閒則發送。所以數據幀的最小大小要爲64byte,而且數據線還不能大於100米,否則會造成認定時間錯誤。
當出了局域網後,進入了公網。不管三七二十一,有數據包出來就發送。這樣造成了數據衝突怎麼辦,他就不管了,反正他也管不了,沒法知道數據已經衝突了,這就交給傳輸層解決。反正數據鏈路層我就是儘量的發送。
此外還可以通過劃分信道的方式。如ADSL技術,早期的時候用電話線邊打電話邊上網。ADSL技術採用頻分複用技術把普通的電話線分成了電話、上行和下行三個相對獨立的信道,即電話和上網發送數據的頻率不一致。從而避免了相互之間的干擾。用戶可以邊打電話邊上網,不用擔心上網速率和通話質量下降的情況。

工作在數據鏈路層的設備是交換機。接下來說明下交換機和集線器的區別:
集線器很簡單,當有數據包經過他的時候,什麼也不管不判斷,直接進行廣播轉發了。
相比較集線器,交換機就智能多了,他增加了判斷功能。如下圖,機器1發送一個ARP廣播尋找機器2的MAC地址的時候。當2收到了之後,他會直接響應,當交換機A也能收到,他也會進行發送廣播給右邊的局域網,但是交換機A會發現機器2的MAC地址不是在右邊。所以當機器1再次通過ARP尋找機器2MAC地址的時候,交換機A就不會再轉發到右邊的局域網中了,因爲它可以記住。若是換成Hub(集線器),它從不解析包,直接轉發。
但是這麼好用的交換機也會帶來新的問題,如果交換器成一個環的時候,那麼就會出現無限循環-複製-再循環的問題,最終會塞滿整個網絡。解決辦法就是將一個環通過算法解析成一棵樹的形式,這就是STP協議。詳細內容我也不太懂,感覺意義不太,以後有空再研究了。

 

4、ICMP協議(互聯網控制報文協議)

首先爲什麼未出現這個協議了?ICMP協議是在網絡層中,它是在IP協議的上面,說明IP協議是爲ICMP協議服務的。因爲網絡世界錯綜複雜,當一個數據包在網絡傳輸不能到達的時候,你得知道是怎麼回事吧,是生命週期都用完了都找不到,還是終點不可到達了。作爲一個成熟的網絡協議,必須要心裏有數。有了問題我就給你發個ICMP包,這樣你就知道當前是什麼情況了。

ICMP報文格式

通過TYPE和CODE就知道當前是問題了,下面是從百度百科中截取的部分對照表。

 

對照表

ICMP的一個方式就是差錯報文類型,另一個是查詢報文類型ping命令。

從TYPE角度來看,終點不可達爲3,源主機抑制爲4(目標主動停止),超時爲11(生命週期SST用完了)。這樣就知道當前怎麼回事了。CODE是更加詳細的問題描述,0代表網絡不可達,1代表主機不可達等等。

ping命令

在公司,每次連不上服務器,運維大佬都會先說下,先ping一下,檢查網絡之間是不是通的。當然這個也不是十分準確的,有的時候服務器會過濾掉ICMP協議的內容,最好改用Telnet。
這個ping命令發出去的包是符合ICMP協議的。這個是主動查詢報文類型,如上圖的ICMP報文格式中,ping的類型多了標識符,序號和數據。其中標識符代表不同的任務,序號代表爲了這個任務發送了多個數據包,總得給不同的數據包標個序號吧,這樣就會知道誰回來啦,誰沒回來。

比如ping 192.168.1.2(位於筆者電腦同一個局域網中)
開始執行的時候,主機會構建一個ICMP包,TYPE爲8,CODE爲0。這樣就代表ping請求了。並分配一個標識符,和順序號,每發一個數據包,順序號都會自動加一。有了順序號就會就算往返時間了,在一定時間沒返回,就會被認爲是不可到達。ICMP數據包就會到達IP層,封裝層IP數據包。當然也會用到192.168.1.2、ARP獲取目標MAC地址等等。這樣目標收到後,開始解析,對比是不是自己的。數據鏈路層檢查後,交給IP層,最後再到了ICMP層。ICMP會分析傳遞的內容,並構建一個響應的ICMP,TYPE=0,CODE=0,順序號一致,返回回去。這樣一個簡單的ping操作就完成了。

ICMP差錯報文類型的使用

追蹤每一跳IP


Windows中使用tracert ip命令,就可以查看每一跳的IP地址了,這就是利用了ICMP協議,通過設置TTL值。當TTL=1的時候,那麼經過了第一個網卡後就掛了,會返回一個帶有當前IP的ICMP數據包。再設置TTL=2,這樣就拿到了第一個網卡的IP地址。通過欺騙的方式還有很多,通過設置數據包不分片來獲取沿途的MTU大小。當然還有其它的應用了。

 

5、IP協議

一臺電腦怎麼上網?先配置網卡,IP地址、子網掩碼和默認網關。DHCP可以默認配置的。網關是很重要的,沒有網關,你的電腦根本到不了其他的網段,因爲網關是到達英特網的下一跳。

 

IP協議頭

 

IP是面向點對點的,通俗的說就是找到該網卡的設備。如上圖所示,先說明每個字段的基本含義再說。

  • 版本 : IP版本,IPV4(32位) 、IPV6(128位)
  • 首部長度:頭部長度
  • TOS:設置優先級、吞吐量、延遲信息
  • 總長度: 首部和數據之和的長度
  • 標識:IP軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識字段。當數據報由於長度超過網絡的MTU而必須分片時,這個標識字段的值就被複制到所有的數據報的標識字段中。相同的標識字段的值使分片後的各數據報片最後能正確地重裝成爲原來的數據報。
  • 標誌:前只有2位有意義。MF=1即表示後面“還有分片”的數據報。MF=0表示這已是若干數據報片中的最後一個。只有當DF=0時才允許分片。
  • 片偏移:較長的分組在分片後,某片在原分組中的相對位置。
  • 生存時間:每到一個路由器,就需要減一,到0時候停止發送。
  • 協議:協議字段指出此數據報攜帶的數據是使用何種協議,TCP/UDP/ICMP/IGMP,以便使目的主機的IP層知道應將數據部分上交給哪個處理過程。
  • 首部校驗和:路由器都要重新計算一下首部檢驗和
  • 最主要的是目標IP和源IP地址(代表了面向點對點)

你的電腦訪問另外一臺電腦可以分爲兩種情況,一是同網段的訪問,另一種便是不同網段的訪問。
公共點:都先要通過子網掩碼判斷是不是同一個網段,若是同一個網段就不關網關什麼事了。
如果判斷是不同網段,那就開始分裝傳輸層、IP協議頭、將自己和網關的MAC地址分裝起來,開始發送。網關會開始解析出目標MAC地址,發現是自己的。然後在解析出IP頭,判斷這個數據包要到那裏去。這裏可以通過靜態路由表或者動態路由來查詢下一跳是誰。然後將解析出的數據包開始一層層的分裝。只不過這時候的源MAC地址是網關的,目標MAC地址改成了下一跳的MAC地址了。所以說,每經過一跳MAC地址都會改變。

從網關的角度劃分,可以分爲轉發網關和NAT網關。
爲什麼會出現NAT網關了?這是因爲私有IP的出現,比如你學校上網的IP是192.168.1.101,合工大的也有一個IP叫做192.168.1.101。這個時候你去訪問他,你要是直接進行訪問,那是不可能的,你的電腦直接就會判斷這是訪問我自己的。所以這個時候要進行轉換IP,NAT網關就是這樣作用的。

NAT網關


現在就以NAT網關爲例,探討A與B通信過程:

 

顯然服務器A和B的地址是一樣的,但是這個地址僅限於局域網中,首先服務器B有一個國際的IP,假設是192.168.56.2。網關B上有一個記錄,192.168.56.2對應了局域網中的192.168.1.101這個地址。
這個時候A開始發送數據包了:
源IP爲192.168.1.101,目標IP爲192.168.56.2,目標MAC爲網關A的。
網關A收到了數據包後,開始解析。找到下一跳,併發送給了192.168.56.2,此時A也要有個國際的身份192.168.56.1,那麼發送包的內容是:
源IP爲192.168.56.1,目標IP爲192.168.56.2,目標MAC爲192.168.56.2的。
數據包到達了192.168.56.2這個口後,因爲路由器B是一個NAT網關,開始將192.168.56.2這個地址轉換成192.168.1.101,於是改成訪問了192.168.1.101這個網卡了。經過這樣的過程就達到了替換的過程了。當然了真實的替換是比較複雜的,都會有相應的算法記錄,絕不是簡簡單單的通過IP地址來的,這裏就一帶而過了。
通過訪問https://www.whatismyip.com就可以訪問到自己公共的IP地址了。

public ipv4

 

IP路由協議:

接下來說說IP路由協議,網絡層的一個很重要的作用就是提供IP選址的服務。路由協議分爲靜態路由協議和動態路由協議。

靜態路由協議:

配置靜態路由,就是給一個網卡設置一個路由規則,一個簡單的路由規則包括目標IP、從哪個口出去、下一跳的網關。

Windows中靜態路由操作:
route  add  10.253.251.0  mask  255.255.255.0  -p  192.254.1.1 //添加一條靜態路由
route  add  10.253.251.0  mask  255.255.255.0  -p  192.254.1.1 // 刪除

靜態路由一般用於網絡的拓撲簡單的情況下。複雜的網絡下,會牽一髮動全身,複雜會指數的增加。

動態路由協議:

如果能夠動態的根據網絡的實際情況生成路由表,那就太好了,別怕,動態路由算法拯救你。歸根結底,網絡就是一張複雜的圖,動態路由協議就是找一個最小路徑。大學的數據結構中,有兩種策略,一種是深度遍歷,另一個是廣度遍歷。
第一大類算法是基於BellmanFork算法的距離矢量路由。基本思路是:每個路由器都會保存一個全局的路由表,每條數據就是目標IP和到達目標IP的距離。每隔一段時間,每個路由器就將自己的路由表情況告訴鄰居,每個路由表在對照自己的路由表,進行更新操作。
缺點就是:每次發送全局的路由表,極度的冗餘;對於一個路由器掛掉了這樣的消息就有問題了,別的路由器會一直的從鄰居那裏獲取到達壞掉的路由器的距離,這樣一直一直增長超過最大值,纔會認爲這個路由器斷掉了。
第二類算法是基於Dijkstra算法的鏈路狀態路由算法。他的基本思路就是,一個路由啓動的時候,他會給鄰居發一個消息,鄰居在回覆,時間除以二就是距離了。再將這個路由廣播出去,這樣整個網絡就知道了。每個路由器就有了一張圖,再用路由表進行Dijkstra算法找到最短路徑。

6、UDP協議(傳輸層):

先回顧下,網絡層完成的是找到目標設備,但是找到了目標設備還遠遠的不夠,因爲一個設備有很多進程。所以傳輸層的任務就是找到目標地址的目標端口。

簡單的說下,UPD和TCP的區別:1、TCP是面向連接的,UDP是無連接的。所謂的建立連接,是指客戶端和服務端通過三次握手,建立一個雙方的數據結構,這樣就知道對方處於什麼狀態下了,就這叫做面向連接的。2、TCP的面向連接,可以做到可靠性的數據傳輸,UDP則是不安全的。3、TCP是面向字節流的,這意味着接受者接收的時候接收的一個流,而UDP繼承了IP包特性,發和收都是一個個包。4、TCP是通過擁塞窗口可以做到擁塞控制。

UDP格式


從UDP協議頭就可以看出UDP相當簡單,源目標端口號、長度、校驗值和數據外就沒了。
因爲簡單,在已下的場景用的比較多:

 

  • 內網情況,網絡比較好。
  • 對丟包不太敏感的,如直播
  • 廣播主播的應用,不是一對一建立連接的。

雖然UDP比較簡單,但應用比較多,很多是基於UDP協議進行的二次封裝,這樣既保證了可靠性,也具備了速度。如谷歌提出的QUIC應用層協議,可以快速的建立連接、減少重傳時延、自適應擁塞控制等等;

7、TCP協議

TCP協議頭

摘自百度百科,看戲每個字段的含義:

  • Source Port是源端口,16位。
  • Destination Port是目的端口,16位。
  • Sequence Number是發送數據包中的第一個字節的序列號,32位。
  • Acknowledgment Number是確認序列號,32位。
  • Data Offset是數據偏移,4位,該字段的值是TCP首部(包括選項)長度除以4。
  • 標誌位: 6位,
  • URG表示Urgent Pointer字段有意義:
  • ACK表示Acknowledgment Number字段有意義
  • PSH表示Push功能,RST表示復位TCP連接
  • SYN表示SYN報文(在建立TCP連接的時候使用)
  • FIN表示沒有數據需要發送了(在關閉TCP連接的時候使用)
  • Window表示接收緩衝區的空閒空間,16位,用來告訴TCP連接對端自己能夠接收的最大數據長度。由此做到流量控制。
  • Checksum是校驗和,16位。
  • Urgent Pointers是緊急指針,16位,只有URG標誌位被設置時該字段纔有意義,表示緊急數據相對序列號(Sequence Number字段的值)的偏移。

TCP三次握手

握手流程

  • 開始都是CLOSED狀態,A發送一個SYN=1,代表開始同步請求,seq=x代表數據包第一個字節的序列號。A由此進入到SYN-SENT等待連接狀態。
  • B收到A請求連接後,由LISTEN監聽狀態到達SYS-RCVD狀態。回覆數據包括,SYN=1代表我也是請求連接,seq=y代表我的開始字節號是y。ACK=1代表收到了你的請求,ack=x+1代表是對你的序號爲x的確定。
  • A收到了B的響應後就進入到了連接狀態了,那麼對於A來說已經處於連接狀態,B還不是,所以A還要個B發一個響應。ACK=1 ack=y+1代表對序列號爲y的確認。B收到後,纔算三次握手結束。

面試的時候總是問,爲什麼要三次握手了,兩次行不行?三次握手是個折中辦法,並不是非常可靠,100次握手也不可靠,但肯定不能無限的握手吧,所以就三次了。兩次不行的原因是,A來說一次響應一次回覆收到,代表A連接成功,那麼B卻是隻發了一個請求,並沒與響應,對B來說就一點也不可靠了。所以得B也收到了響應纔算握手成功。只要雙方的消息都有來有回就可以了。
三次握手的作用處理建立連接之外,還是雙方確定對方數據包的開始位置即序號的起始。這樣纔可以爲爲以後收發數據做好準備了。

TCP四次揮手

揮手結束過程

爲什麼揮手要四次,握手三次就可以了?因爲A數據傳輸結束後想結束握手,但不確定B的數據就一定傳輸完成了啊,只有B的數據傳輸完成後纔會發送傳輸結束請求。

  • 開始A發送FIN=1代表想結束這次會話開始進入到FIN-WINT-1狀態
  • B收到了,響應A剛纔的請求,代表我同意你的結束請求,但此時並不是真正的斷開連接。
  • 等到B數據傳輸完成後,也發一個斷開連接請求,FIN=1,ACK=1,同時也是對上一次響應的回覆。
  • A收到了斷開連接請求並沒有馬上進入到CLOSED狀態,這是防止發給B的響應B並沒有收到,只有需要等待2MSL週期才認爲結束,同時B收到了A的響應消息就進入到了CLOSED狀態。A在超過2MSL外又收到了B的斷開連接請求後,會發送一個RST=1的響應,告訴B我早就斷開連接了。

 

爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。在Client發送出最後的ACK回覆,但該ACK可能丟失。Server如果沒有收到ACK,將不斷重複發送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK之後進入到TIME_WAIT狀態。Client會設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網絡中最大的存活時間,2MSL就是一個發送和一個回覆所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被成功接收,則結束TCP連接
 

 

如果已經建立了連接,但是客戶端突然出現故障了怎麼辦?

TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設置爲2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以後每隔75秒鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認爲客戶端出了故障,接着就關閉連接
 

 

tcp標誌位有6種標示:

SYN(synchronous建立連接)

ACK(acknowledgement 確認連接)

PSH(push傳送數據)

FIN(finish結束連接)

RST(reset重置連接)

URG(urgent緊急情況)

 

從建立連接到結束整個過程Client端所經歷的狀態如下

從建立連接到結束 Server端所經歷的過程如下

 

 

滑動窗口機制

首先滑動窗口機制解決了數據包的順序問題、丟包問題和流量控制。它是發送方的一個機制,記錄了當前發送方的數據包發送情況,哪些發送了,哪些確認了,哪些需要重發等等。如圖所示:

 

發送端滑動窗口

  • 1-3 代表了服務端響應已經收到了,這時客戶端就可以將其從緩存中去掉
  • 4-9 代表了客戶端已經發送了,但還沒得到確認,至於服務端收沒收到不確定
  • 10-12 代表了還沒發送卻可以發送,因爲當前網絡是可以忙的過來的
  • 13-15 代表了不僅沒發送,這會還不能發送,要不然會讓網絡擁塞

接收端滑動窗口

  • 1-5代表我也經接收了,並且已經確認過的
  • 6-14代表還沒接收到,這是接收端還能接收到的最大數量了
  • 15代表,不能接收的,接收了就處理不過來了
    此時接收端的滑動窗口大小爲:等待接收未確認的這部分,接收端會將這個值一同的返回給發送端,和發送端一起調節流量發送速度。

順序問題和丟包問題
假設8和9接收端已經收到了。但是這時還不能接收,因爲6/7還沒有來,這就出現了順序問題。假設4-7全部丟失了,那麼接收端該怎麼處理了,其實接收端會有個計時器,如果超過一定的時間(時間是根據網絡情況自動的調節的),就默認丟了,就會重新的發送。
流量問題
流量是針對接收方來說的,如果接收方處理不過來,就會響應時一併發送窗口大小,如果窗口不斷的變小,那麼接收端也會調節大小。這樣就會使接收方發送的數據減少。

擁塞窗口機制

擁塞窗口是爲了解決網絡擁塞的問題,滑動窗口則是解決接收端緩存過大問題。
擁塞窗口採用的慢開始、擁塞控制、快重傳、快恢復的方法。
發送端建立一個擁塞窗口,該窗口大小使用擁塞窗口和滑動窗口一併控制的。發送端先發送一個1字節的試探報文,這叫做慢開始。當收到第一個字節的數據的確認後,再發送2個字節的報文;依次以2次方數量發送,發送到什麼時候爲止了,這就開始設置一個閾值。小於它就指數增長,大於的時候就改用線性增長,每次加一個字節。當出現丟包的時候,就將發送值改成1字節,再將慢開始門限設爲原先的一半,重新的走遍開始的流程。
當接收端發現中間丟失了一個數據包的時候,發送三個前一個數據包的確認包,於是發送端就是快速重傳,這就是快重傳。將起點設置爲之前的一半,這樣就不用從1個數據包開始發了。但是之後就改成了線性增長了。

 

擁塞窗口執行過程

 

 

發佈了515 篇原創文章 · 獲贊 142 · 訪問量 100萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章