(《一個陌生女人的來信》)借名著說一些網路基礎知識

LINGLONG發表於2020-04-02

(《一個陌生女人的來信》)借名著說一些網路基礎知識

前言

最近複習網路的知識,很多抽象的知識不由自主聯想想到自己看過的一些小說。自己也腦補了一些情節。

於是用這種方式梳理了一些網路中基礎而重要的知識。希望給正在看文章的你帶來一絲啟發✨

第一節:兒子送信-認識五層網路模型

這裡用故事將五層網路模型形象化,您可以抓重點直接看精華部分——第六點資料傳輸的本質或者從後面章節開始?

1.應用層

故事從女主給作家寫信送信開始了。

陌生女人想給作家寫信,陌生女人就相當於是瀏覽器,作家就是伺服器上的程式。這些層序就屬於應用層。

應用層的主要作用是為使用者的應用程式提供服務

陌生女人(簡稱女主) ---瀏覽器

作家 -- 伺服器上的程式

信件---傳輸的資料

HTTP協議

女主比較羞澀,於是叫自己的兒子幫忙去送信,可憐的兒子出生後就沒見過自己的父親,陌生女人母親擔心兒子送錯了人,於是向女主的兒子和作家之間約定了一個暗號。這個暗號就是我們所說的http協議

http協議是應用層之間的協議之一,規定了上述例子中傳信過程中通訊和互動的規則。應用層上的協議有很多,DNS域名解析協議,FTP檔案傳輸協議等等,不同的協議對應著不同的網路應用。

有了這個暗號信就不會送錯啦,就像前段時間疫情影響,回家小區門口還要對個暗號,比如:

(《一個陌生女人的來信》)借名著說一些網路基礎知識

兒子問:朱自清《春》第二段第一句 作家答:一切都像剛睡醒的樣子。 如果兒子把信不小心送給了一個畫家,畫家可能覺得這孩子。。。背書背傻了吧。

2.傳輸層

傳輸層為兩臺主機上的程式提供資料傳輸的服務。 (大家都知道伺服器可看成一臺計算機吧✨)

如果沒有傳輸層的服務那麼陌女想給作家傳信也無法傳遞,就像高鐵不給我售票我想回家也回不去。

埠號

說道程式之間的通訊,這裡引入埠號的概念。 先捋一捋埠號是什麼。✨

  1. 每一個房子相當於連線到連線到網路中的一臺計算機。

  2. 每個房子裡有很多個房間,房間相當於連線到網路中的計算機上的一個應用程式。

  3. 根據門牌號找到不同的房間,門牌號類比於埠號,根據不同的埠號找不同的應用程式。

引用一段官方解釋:

埠號的主要作用是表示一臺計算機中的特定程式所提供的服務。網路中的計算機是通過IP地址來代表其身份的,它只能表示某臺特定的計算機,但是一臺計算機上可以同時提供很多個服務,如資料庫服務、FTP服務、Web服務等,我們就通過埠號來區別相同計算機所提供的這些不同的服務,如常見的埠號21表示的是FTP服務

現在應該知道埠號是啥了吧。接著講講複用分用.

由於一個主機可同時執行多個程式(程式可以理解為每個應用程式,瀏覽器就是一個應用程式可看作程式),因此運輸層有複用和分用的功能。

可能你還不明白複用和分用,那下面就對複用和分用進一步說明。

  • 複用:多個應用層的程式可以同時使用傳輸層的服務

比如在女主(瀏覽器)向作家(伺服器上程式)送信的過程中。這個時候微信也在訪問伺服器上相應的程式那麼也會使用傳輸層。

  • 分用:分用和複用相反,是把傳輸層的東西分開傳送到上面的應用層。✨

ok,那傳輸層有哪些協議呢

傳輸層的協議

這個時候女主兒子要去送信了,這個時候陌女通常有兩個選擇。

  1. 可以選擇做其他的事情,在家等兒子帶著資訊回來,如果兒子把信弄丟了啥的沒有送到作家手裡都不管,心大型比較佛系的哈

  2. 然後還有一種就是焦急的等待著,等待著...等待著兒子的回信,如果兒子半路上把信弄丟了趕緊再寫一封送過去重頭開始。

上述的兩種方法對應著傳輸層的兩種協議

  1. UDP使用者資料包協議(User Datagram Protocol)

提供無連線的,盡最大努力的資料傳輸服務(不保證資料傳輸的可靠性)。 - 在送信途中如果把信弄丟了在網路中稱之為丟包

  1. TCP 傳輸控制協議(Transmission Control Protocol)

面向連線的,資料傳數單位是報文段(segment),能夠提供可靠的交付。

UDP/TCP兩者區別
  • TCP是一個面向連線的、可靠的、基於位元組流的傳輸層協議。

  • 而UDP是一個面向無連線的傳輸層協議。

型別 特點1 特點2 特點3 效能 1 效能2 應用場景 舉例
----- 是否面向連線 傳輸可靠性 傳輸形式 傳輸效率 所需資源
tcp 面向連線 可靠 位元組流 要求通訊資料可靠 QQ微信通話
udp 無連線 不可靠 資料包文段 要求通訊速度高 檔案傳輸、接收郵件

3.網路層(IP層)

兒子拿到信後準備送信了,送信要知道路怎麼走,要知道路怎麼走就得知道目的地的地址呀,當然在傳輸層的時候就已經知道作家的地址了。

在網路層中要找到一條合適的路。

陌女的地址(出發地 紫薇園四棟三單元201室)作家的地址(目的地 葵花園三棟三單元502室)。

兒子在某地圖中輸入出發地,目的地,就找到了一條給爸爸送信的路。

網路層形象化

計算機世界的交通網路可以類比我們生活中的交通網路,錯綜複雜。計算機中網路的世界就是我們平時說的網路層

網路層為不同的主機提供服務 在傳送資料時,網路層把運輸層產生的報文段或使用者資料包封裝成分組或包進行傳送。

負責為分組交換網上的不同主機提供通訊服務;選擇合適的路由,使源主機運輸層所傳下來的分組,能夠通過網路中的路由器找到目的主機。

注意傳輸層是為主機上的程式,網路層是為主機提供服務。

IP地址和IP協議
  1. IP地址:IP地址就是給每個連線在網際網路上的主機分配的一個32位地址。
IP地址 = 網路地址 + 主機地址 
或
IP地址 = 網路地址 + 子網地址 + 主機地址
複製程式碼
  IP地址只能找到網路中的某臺主機,無法準確定位到主機中的應用程式。
複製程式碼
  1. IP(網際互連協議)協議:是TCP/IP體系中的網路層協議。

    協議可以理解成一些規定規則,那麼跟IP地址完全不是一個概念了嘛

    在網路中通常使用IP地址+埠號來定位一個程式在計算機中的位置,這種方式就是一種IP協議。

這個時候,兒子在運輸層拿到了作家的地址了,網路層找到了最好路線,要準備出發了。

what???搞了這麼半天還沒走???真滴是黑人問號。

(《一個陌生女人的來信》)借名著說一些網路基礎知識

別急,接下來是資料鏈路層?‍?

4.資料鏈路層

為什麼有資料鏈路層

兩臺主機之間的資料傳輸,總是在一段一段的鏈路上傳送的。

資料鏈路層定義了在單個鏈路上如何傳輸資料。

紫薇園四棟三單元201室 ————> 南京路 ————> 萬達廣場 ————>葵花園三棟三單元502室這是送信的路徑,紫薇園四棟三單元201室 ————> 南京路就像是1個鏈路。

資料鏈路層的任務
  • 資料鏈路層將網路層交下來的 IP 資料包組裝成,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括資料和必要的控制資訊(如同步資訊,地址資訊,差錯控制等)。

  • 資料鏈路層主要有兩個功能 :幀編碼和誤差糾正控制。

  • 資料鏈路層協議又被分為兩個子層 :邏輯鏈路控制(LLC)協議和媒體訪問控制(MAC)協議。

  1. 邏輯鏈路控制(LLC)協議:好比在地圖中看到的路線圖,虛擬的。
  2. 媒體訪問控制(MAC)協議:現實世界中中存在的路線圖,真實的。 這個時候兒子根據路線圖在走著呢,走著看到一個馬車就上了車。

5.物理層

物理層負責的是透明的位元流傳輸確保原始的資料可在各種物理媒體上傳輸。

over,五層模型就差不多介紹完了,下面回顧一下。

  • 應用層:規定了開門的暗號。http協議
  • 運輸層:找到了準確地址。TCP/UDP協議
  • 網路層:找到一條合適的路。IP協議
  • 資料鏈路層:坐著馬車出發了。MAC/LLc協議
  • 物理層:到達作家附近,下車。一些協議

當信送到物理層後還是沒有到達作家的手裡,作家此時是在應用層的。而信還在伺服器網路的物理層,所以又是一個從物理層到應用層的過程。

物理層->資料鏈路層->網路層->運輸層->應用層

6.資料傳輸的本質

講故事是為了便於生動理解整個過程,但是為了防止大家陷入故事情節無法自拔。 我想說一下資料在五層網路結構中傳輸的本質。

資料在網路的每層結構中傳輸,共同的目的都是把資料從主機A傳到主機B。但是這個資料不是直接傳輸的。這個資料在主機A的網路中會經過五層結構的封裝送到了主機B的網路,送過去的是包裝好的資料,想要拿到資料就會再經過五層結構的解封拿到真正想要的資料。

引用一下《圖解HTTP》中的圖:

(《一個陌生女人的來信》)借名著說一些網路基礎知識

再來個栗子~

假如你網上買了個100萬的青花瓷瓶,快遞公司要把它寄過來。這麼貴重的易碎品是不是要包好幾層泡沫啥的,假如包了五層。這樣一層接著一層小心翼翼的包好後發貨。過了一段時間收到貨了你想要的是青花瓷,又小心翼翼的拆開五層包裝最後拿到了青花瓷。

每層協議的本質就是在資料外面套一層層特殊的資料,在資料送到的時候將一層層協議拆開拿到想要的資料

7.其他計算機網路體系結構

計算機網路體系結構有三種:OSI七層體系結構、TCP/IP體系結構和上面的五層體系結構。 五層體系結構是前兩者的融合

(《一個陌生女人的來信》)借名著說一些網路基礎知識

七層結構將應用層分為三層:應用層表示層和會話層,表示層和會話層沒有相應的協議,一般表示層做資料格式化或者加密等操作。

第二節:前往千度-域名解析的過程

DNS域名解析協議是應用層的協議,主要將域名解析成IP地址。 我們接著上一篇的送信來講今天的故事。

話說兒子送到了信,作家很驚訝,自己什麼時候留下了一顆小種子,還發芽了???待兒子向作家說明了一切,作家想起了陌生女人,並且約她去千度參加一個舞會,七點在千度等她。

陌生女人心想:嗚嗚嗚,渣男,竟然不來接我,但是她還是決定先去千度參加舞會?。

這裡的千度就是網路中的域名。每個域名都對應這一個IP地址。IP地址就是一個32位的表示主機的地址。比如168.0.0.1

域名和IP地址都表示某個主機,他們可以說是一個東西也可以說不一樣。域名是便於使用者使用(作家不會說我在169.0.0.1等你),IP地址是便於計算機使用。

  1. 女主在自己腦子裡想了一會不知道千度在哪呀,也就是不知道www.qiandu.com這個域名在哪裡了,這個過程類似於網路中在瀏覽器輸入www.qiandu.com的時候會先在瀏覽器本地快取檢視有沒有這個域名對應的IP地址。如果沒有稱之為沒命中。

  2. 女主發現自己腦子裡沒有千度這個地方,那個年代大哥大都還沒有,就翻開自己的地圖小本本看看有沒有記錄www.qiandu.com的IP地址。在網路中本地瀏覽器的快取沒有命中就會檢視主機的host檔案中有沒有記錄這個域名對應的IP地址。如果沒有就進行下一步。

  3. 女主翻完了地圖小本本還是木有找到,但是她不放棄一定要去千度,只能去求助隔壁的村花丫蛋,丫蛋只知道百度,千度還真不知道。丫蛋也不知道的話會進行下一步操作。在網路中丫蛋相當於DNS解析伺服器,本地的DNS伺服器叫LDNS。

  4. 丫蛋不知道千度在哪,跟女主說我過會告訴你。於是丫蛋去問自己的哥哥,皮蛋是個百事通,就告訴了丫蛋千度在哪裡。在網路中如果本地的DNS伺服器找不到的時候就會向上一級查詢,也就是通用頂級域伺服器gTLD(g表示generic top-lever)。比如.com/.org/.cn等字尾。這個時候gTLD告訴LDNS去168.0.0.1這個主機上去找。

  5. 丫蛋從哥哥那知道地址後,就去告訴女主啦,同時丫蛋也記住了千度這個域名對應的IP。女主腦子裡也記住了這個IP,方便下次約會可以很快響應,嘿嘿~

以上就是域名解析的過程。先在本機快取和hosts檔案中尋找,再到本地域名解析伺服器尋找,最後到通用頂級域伺服器尋找。如果中途找到了對應的IP就停止向下查詢。

域名劫持:這裡補充一個知識點域名劫持。前面說在windows中可通過c盤裡一個叫hosts的檔案來設定,如果你在這裡指定了一個域名對應的ip地址,那瀏覽器會首先使用這個ip地址。

但是這種作業系統級別的域名解析規程也被很多黑客利用,通過修改你的hosts檔案裡的內容把特定的域名解析到他指定的ip地址上,造成所謂的域名劫持

就想象某人嫉妒女主不想讓她與作家見面就故意修改了她的地圖小本本誤導女主去了其他的地方。?

第三節:約會必備-TCP報文格式

女主聽說舞會上喜歡TCP的三次握手方式交朋友,這樣比較嚴謹。emmm於是女主決定去學習一下這種打招呼的方式,畢竟在舞會上那麼多人呢,女主就從認識TCP報文格式開始啦。

(原諒我這一節著實不知道怎麼編故事?)

直接上圖吧!LINGLONG覺得六個標誌位和特殊的ack確認號,seq序列號是一定要知道的。

(《一個陌生女人的來信》)借名著說一些網路基礎知識

  • source port/destination port:表示源埠、目的埠。源埠標識報文的返回地址,目的埠表示接收方計算機上應用程式介面。

  • 唯一確定一條TCP連線:源埠+目的埠+源IP地址+目的IP地址

  • Sequence Number/Acknoledgment:序列號seq/確認號ack。

    • 在TCP傳送的流中,每一個位元組一個序號。比如一個報文段的序號為300,此報文段資料部分共有100位元組,則下一個報文段的序號為400。所以序號確保了TCP傳輸的有序性。
    • 確認號指明下一個期待收到的位元組序號,表明該序號之前的所有資料已經正確無誤的收到。確認號只有當ACK標誌為1時才有效。比如建立連線時,SYN報文的ACK標誌位為0。
    • 注意ACK是一個標誌位(非0即1)與確認號ack不同。
  • Data-Offset:資料偏移,也叫首部長度。

  • Reserved:保留。為將來定義新的用途保留,現在一般置0

  • 六個標誌位

    1. URG:緊急指標標誌,為1時表示緊急指標有效,為0則忽略緊急指標。

    2. ACK:確認序號標誌,為1時表示確認號有效,為0表示報文中不含確認資訊,忽略確認號欄位。與前面的確認號息息相關但兩者不是一個東西

    3. PSH:push標誌,為1表示是帶有push標誌的資料,指示接收方在接收到該報文段以後,應儘快將這個報文段交給應用程式,而不是在緩衝區排隊。

    4. RST:重置連線標誌,用於重置由於主機崩潰或其他原因而出現錯誤的連線。或者用於拒絕非法的報文段和拒絕連線請求。

    5. SYN:同步序號,用於建立連線過程,在連線請求中,SYN=1和ACK=0表示該資料段沒有使用捎帶的確認域,而連線應答捎帶一個確認,即SYN=1和ACK=1。

    6. FIN:finish標誌,用於釋放連線,為1時表示傳送方已經沒有資料傳送了,即關閉本方資料流。

  • Window視窗:滑動視窗大小,用來告知傳送端接受端的快取大小,以此控制傳送端傳送資料的速率,從而達到流量控制。視窗大小時一個16bit欄位,因而視窗大小最大為65535。

  • check sum校驗和:奇偶校驗,此校驗和是對整個的 TCP 報文段,包括 TCP 頭部和 TCP 資料,以 16 位字進行計算所得。由傳送端計算和儲存,並由接收端進行驗證。

  • urgent pointer緊急指標:只有當 URG 標誌置 1 時緊急指標才有效。緊急指標是一個正的偏移量,和順序號欄位中的值相加表示緊急資料最後一個位元組的序號。 TCP 的緊急方式是傳送端向另一端傳送緊急資料的一種方式。

  • opptions/padding選項和填充:最常見的可選欄位是最長報文大小,又稱為MSS(Maximum Segment Size),每個連線方通常都在通訊的第一個報文段(為建立連線而設定SYN標誌為1的那個段)中指明這個選項,它表示本端所能接受的最大報文段的長度。選項長度不一定是32位的整數倍,所以要加填充位,即在這個欄位中加入額外的零,以保證TCP頭是32的整數倍。

  • data資料部分: TCP 報文段中的資料部分是可選的。在一個連線建立和一個連線終止時,雙方交換的報文段僅有 TCP 首部。如果一方沒有資料要傳送,也使用沒有任何資料的首部來確認收到的資料。在處理超時的許多情況中,也會傳送不帶任何資料的報文段。

說明:這裡的內容參考了TCP報文格式詳解

第四節:千度相遇-TCP三次握手

話說第二回女主經過域名解析後找到了千度的IP地址168.0.0.1,也學會了TCP握手的基本要領。於是準備前往千度去尋找她心愛的作家。

1.三次握手解析

TCP是一個可靠的,面向連線的位元組流的傳輸層協議。

為什麼有三次握手

面向連線意味著兩個使用 TCP 的應用(通常是一個客戶和一個伺服器)在彼此交換資料之前必須先建立一個 TCP 連線,這個連線就是三次握手。在一個 TCP 連線中,僅有兩方進行彼此通訊。

因此網路中三次握手是為了確定兩臺主機之間具有收和發的能力,如果一方有問題資訊就不會傳送。女主和作家之間的三次握手是為了鑑別自己能否認出對方和被認出。

同時也說明了UDP為什麼沒有握手。

三次握手過程

假如伺服器是作家,客戶端是女主。

第一次握手

女主在馬路對面看到了作家後,欣喜若狂。但是不確定是不是,於是先向作家揮揮手.

在網路中第一次握手也是一個使用TCP的程式向另外一個使用TCP協議的程式打招呼,通常是客戶端向伺服器打招呼。

客戶端打招呼過程中傳遞了兩個資訊:請求建立(SYN=1)和發出一個序列號(seq=n),假設這裡的n是200.

作用:伺服器B知道了客戶端A可以發訊息。作家知道女主認出了自己。

第二次握手

作家看到女主揮手後,點點頭(syn、ack),然後向女主揮揮手(seq)。

在網路中第二次握手伺服器傳遞了三個資訊:分別是同意建立連線(SYN=1),確認收到了剛才的資訊(ack=剛才seq+1即ack=201),發出自己的序列號(seq=x,x也是一個數,假如是99)

作用:客戶端(A)收到服務端(B)的資訊後B可以接收訊息和傳送訊息。女主知道作家看到了我的揮手,認出了我。

第三次握手

女主向作家點頭。

網路中第三次握手客戶端向伺服器發訊息,這個訊息也傳遞了三個資訊:第一個是現在開始傳送(syn=0),第二個是成功收到了伺服器的資訊(ack=seq+1即99+1,ack=100),第三個是發出這次的序列號(seq=最開始發出的序列號200+1=201)

作用:B知道A可以接收資訊。作家知道女主看到了我的揮手。

上述三個過程就是互相試探確認的過程,再複習一下TCP報文格式中ack、seq、syn。

  • ack:確認號,非標誌位。指明下一個期待收到的位元組序號,ACK標誌為1才有效。
  • seq:序列號,非標誌位。表示了傳輸序列的有序性
  • syn:同步序號標誌,標誌位。用來發起一個連線。SYN=1表示這是一個連線請求或連線接受請求。
  • ACK:確認序列號標誌,標誌位。非0即1,1表示確認號有效。

下面看看這張圖理解一下狀態變化。

在第二次握手和第三次握手還會出現一個ACK=1的資訊,它是確認序號有效標識。只有當ACK=1時確認號欄位ack才有效。當ACK=0時,確認號ack無效。

(《一個陌生女人的來信》)借名著說一些網路基礎知識

  • 初始0:客戶端closed關閉,伺服器listen監聽某個埠(其實最開始服務端也是closed狀態)。
  • 狀態1:第一次握手,客戶端向服務端傳送一個序列號syn,客戶端變成syn-send.
  • 狀態2:第二個握手,服務端收到客戶端的資訊並作出回應,服務端變為syn-revd狀態
  • 狀態3:客戶端收到第二次握手的資訊後再告訴伺服器自己收到了此時客戶端是establish狀態。
  • 狀態4:伺服器收到客戶端第三次握手的資訊後也變成了establish狀態。雙方建立了連線。

2.為啥不是兩次或者四次握手

首先,握手是為了讓伺服器和客戶端之間建立連線,確認雙發都具有傳送資訊和接收資訊的能力。如果是兩次握手那麼伺服器就不能確定客戶端能否接收到自己傳送的資訊。so,兩次握手是不可以的。

另外兩次握手的話會出現一些資源浪費的問題,比如說客戶端已經向服務端傳送了一個資訊但是伺服器遲遲沒有收到,客戶端就會重傳,此時伺服器收到後進行第二次握手,成功握手後就開始資料傳輸,傳輸結束後斷開連線。

然後這個時候先前沒有收到的包又到達了伺服器,伺服器就會向客戶端傳送資料包建立連線,但是此時是斷開的客戶端無法做出響應。伺服器卻一直等待客戶端的響應,這就是資源浪費。

最後,四次握手也是可以的,但是我們三次握手的時候就確認了雙方能夠進行交流,不必多此一舉。

3.知道SYN泛洪攻擊嗎&如何應對?

SYN同步序號標誌,用來發起一個連線,也就是在發起連線的時候進行攻擊。

SYN 攻擊是一種典型的 DoS/DDoS攻擊。就是客戶端在短時間內偽造大量不存在的IP地址,並向伺服器不斷地傳送SYN包,Server則回覆確認包,並等待Client確認。會引發下面兩個問題最後導致網路擁塞甚至是系統癱瘓。

  1. 第一次握手結束,伺服器收到大量的SYN包並回復確認包,狀態變為syn-revd後連線放入半連線佇列,佇列中正常的連線因為佇列滿被丟棄無法處理。
  2. IP地址是不存在的,伺服器長時間沒辦法得到客戶端的確認因此不斷向客戶端重發,直至超時。

如何應對 SYN 泛洪 攻擊?

  1. 增加 SYN 連線,也就是增大半連線佇列的容量。
  2. 減少 SYN + ACK 重試次數,避免大量的超時重發。
  3. 利用 SYN Cookie 技術,在服務端接收到SYN後不立即分配連線資源,而是根據這個SYN計算出一個Cookie,連同第二次握手回覆給客戶端,在客戶端回覆ACK的時候帶上這個Cookie值,服務端驗證 Cookie 合法之後才分配連線資源。

4.那什麼是半連線佇列和全連線佇列

首先要知道在伺服器有closed狀態變為listen狀態的時候生成了兩個空佇列----半連線佇列和全連線佇列。

  • 半連線佇列: 入半連線佇列發生在伺服器的syn-revd狀態。

    當客戶端傳送SYN到服務端,服務端收到以後回覆ACK和SYN,狀態由LISTEN變為SYN_RCVD,此時這個連線就被推入半連線佇列。

  • 全連線佇列:入佇列發生在三從握手結束後伺服器的establish狀態。

    當客戶端返回ACK, 服務端接收後,三次握手完成。這個時候連線等待被具體的應用取走,在被取走之前,它會被推入另外一個 TCP 維護的佇列,也就是全連線佇列。

5.ISN(Initial Sequence Number)是固定的嗎?

INS(Initial SequenceNumber初始序列號),客戶端傳送一個SYN標誌位置1的包指明客戶打算連線的伺服器的埠,以及初始序號X,儲存在包頭的序列號(Seq)欄位裡。

三次握手的其中一個重要功能是客戶端和服務端交換 ISN(Initial Sequence Number),以便讓對方知道接下來接收資料的時候如何按序列號組裝資料。如果 ISN 是固定的,攻擊者很容易猜出後續的確認號,因此 ISN 是動態生成的。

6.三次握手過程中可以攜帶資料嗎?

第三次握手可以攜帶資料,其他是不行的。

為什麼第三次可以攜帶資料,因為第三次握手是客戶端向伺服器傳送資料,此時的客戶端已經知道伺服器可以接收和傳送資料,相對安全。

為什麼第一次不行?假如第一次可以傳送資料,攻擊者瘋狂王第一次握手的資料包傳送資料,那麼伺服器就會花大量的時間和空間來處理這些資料。攻擊者根本就不理伺服器的接收、傳送能力是否正常,伺服器就要哭了!

同樣的道理,如果第二次握手瘋狂向客戶端傳送資料,客戶端的接收傳送能力是否正常還沒有確定,客戶端要哭了。

In a word,第一次和第二次握手如果能夠傳送就會增加被攻擊的風險。

7.如果第三次握手丟失了,客戶端服務端會如何處理(有意思)?

這個問題要注意是第三次握手丟失還是第三次握手失敗。

  1. 第三次握手丟失:當客戶端收到服務端的SYN+ACK應答後,其狀態變為ESTABLISHED,並會傳送ACK包給服務端,準備傳送資料了。如果此時ACK在網路中丟失,過了超時計時器後,那麼Server端會重新傳送SYN+ACK包,重傳次數根據/proc/sys/net/ipv4/tcp_synack_retries來指定,預設是5次。如果重傳指定次數到了後,仍然未收到ACK應答,那麼一段時間後,Server自動關閉這個連線。但是Client認為這個連線已經建立,如果Client端向Server寫資料,Server端將以RST包響應,方能感知到Server的錯誤。

  2. 當第三次握手失敗時:伺服器並不會重傳ack報文,而是直接傳送RST報文段,進入CLOSED狀態。這樣做的目的是為了防止SYN洪泛攻擊。

這裡參考牛客網-格子灰的解答?

第五節: 再次分別-TCP四次揮手

女主和作家約會結束後他們也要分開了,在小說中作家和女主那啥後,留下一沓錢就離開了。。。。不得不說作家是個十足渣男吶?

  • 作家:我要回去了,轉了筆錢你(FIN)
  • 女主:我知道了(ack)(知道了)
  • 女主:錢收到了(FIN)(接收完了)
  • 作家:再見(ack)。作家等待2msl後見女主沒有反應消失在人海中(close)。

他們經歷了四次揮手,又回到了原來的樣子。下面講網路中四次揮手的過程。

1.四次揮手過程

三次握手成功後進行TCP之間資料傳輸,資料傳輸結束會進行四次揮手。 這由TCP的半關閉(half-close)造成的。所謂的半關閉,就是結束自己的傳送功能後還能接收來自另一端資料的功能。

  1. 第一次揮手:客戶端告訴伺服器資料發完了。客戶端向伺服器傳送FIN報文。

    • 發出連線釋放報文段(FIN=1,序號seq=p),
    • 並停止再傳送資料,主動關閉TCP連線,
    • 進入FIN_WAIT1(終止等待1)狀態,等待服務端的確認。
  2. 第二次揮手:伺服器知道客戶端資料發完了。伺服器向客戶端傳送ack報文。

    • 服務端收到連線釋放報文段後即發出確認報文段(ACK=1,確認號ack=p+1,序號seq=q),
    • 服務端進入CLOSE_WAIT(關閉等待)狀態,此時的TCP處於半關閉狀態,客戶端到服務端的連線釋放。
    • 客戶端收到服務端的確認後,進入FIN_WAIT2(終止等待2)狀態,等待服務端發出的連線釋放報文段。
  3. 第三次揮手:伺服器告訴客戶端資料接收完了。

    • 服務端沒有要向客戶端發出的資料,服務端發出連線釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=p+1)
    • 服務端進入LAST_ACK(最後確認)狀態,等待客戶端的確認。 客戶端發完了資料但是不確定伺服器有沒有接收成功,所以客戶端收到伺服器接收完畢的反饋後才會真正的斷開連線。
  4. 第四次揮手:客戶端知道伺服器接收完了。

    • 即客戶端收到服務端的連線釋放報文段後,對此發出確認報文段(ACK=1,seq=p+1,ack=w+1),客戶端進入TIME_WAIT(時間等待)狀態。
    • 此時TCP未釋放掉,需要經過時間等待計時器設定的時間2MSL後,客戶端才進入CLOSED狀態。

下圖是客戶端和伺服器建立連線到釋放連線的過程。

(《一個陌生女人的來信》)借名著說一些網路基礎知識

2.為什麼握手三次揮手四次

其實前面也說過是因為TCP的半關閉造成的,與客戶端發資料的功能丟失後還能接收資料有關。

當第一次揮手完成伺服器知道客戶端向自己傳送了fin報文後後,因為此時可能還有資料要發往客戶端故不能立即響應fin報文。伺服器先傳送一個ack表示確認收到,過一段時間等自己的資料傳送完了,再向客戶端傳送fin報文。

3.說一說四次揮手釋放連線時的2MSL,以及為什麼等待是2MSL

首先,2 個 MSL(Maximum Segment Lifetime,報文最大生存時間)的等待時間是為了確保客戶端發出的第四次揮手的ACK報文成功的傳送到了伺服器端。如果沒有成功到達,客戶端會收到一個重發請求,處於time_wait狀態的套接字會立即向對方重發ACK報文,如果成功到達揮手結束。

另外也保證了在關閉連線後不會有還在網路中滯留的報文段去騷擾伺服器。

最後,為什麼要等待2MSL。原因如下:

如果最後一個ACK包丟了,檢測到丟包時用了一個MSL,這時主動關閉端就關閉了,對方請求重發的時候,主動關閉端就接收不到了,就會出現死迴圈。

也就是說第一個MSL檢測第四次握手的ACK是否丟包了。第二個MSL是假如ACK丟包了,這個時候客戶端還沒有關閉,能夠進行重傳ACK;如果第一個MSL結束後客戶端進入close狀態就不會重傳ACK。

這下明白為什麼不是等待一個報文最大生成時間了吧。

最後

掘金社群很多不錯的文章,用心閱讀,用心總結,然後用自己喜歡的方式來理解感覺還是蠻不錯滴?

參考文章

小說介紹

為了更好理解網路,我用小說的男女主來舉例子對原文做了一些篡改,這裡LINGLONG懷著一顆尊重小說的心,用兩句話介紹一下《一個陌生女人的來信》這本書。

作品講述的是一個女孩,在她生命的最後時刻,給作家寫了一封長長的信,講述了自己從小頭片子開始和作家之間的悽美愛情故事。雖然作家曾兩次和女主約會並且還有一個兒子。。。但是作家不記得了。。。小兒子還死掉了。。。

當作家他看到女主的信雖然有些觸動但是仍然沒有想起女孩,就當作家臉盲吧。

總之這是一個漂亮女孩和一個滿腹經綸的作家之間,求而不得暗戀一生的悽美愛情故事。

感謝閱讀

上面是一些計網的基礎知識,希望對你有一些思考和啟發。

如果可以,下一篇圍繞狄更斯的《霧都孤兒》寫一點演算法知識?

(《一個陌生女人的來信》)借名著說一些網路基礎知識

相關文章