所給服務器端程序改寫為能夠同時響應多個客戶端連接請求的服務器程序_一文讀懂客戶端請求是如何到達服務器的...

點擊上方“藍色字體”,選擇 “設為星標”

關鍵訊息,D1時間送達!

a28f4bc142113576253ada76bb66b3bf.png

互聯網是人類歷史上最偉大的發明創造之一,而構成互聯網架構的核心在于TCP/IP協議。那么TCP/IP是如何工作的呢,我們先從數據包開始講起。

1、數據包

一、HTTP請求和響應步驟

3c411e5d3c9f877591f807d7ddf51d80.png

http請求全過程

c785074885b9007ebb18620e22a5e6eb.png

請求

7a6b1717d64a2037463751cf24c9cec3.png

響應

以上完整表示了HTTP請求和響應的7個步驟,下面從TCP/IP協議模型的角度來理解HTTP請求和響應如何傳遞的。

2、TCP/IP概述

我們以RFC 1180中的圖作為參考

30ae262fd0c25d45a1a6ead68990d05e.png

上圖展示了四層TCP/IP協議圖,其中network applications是應用程序,屬于應用層;TCP和UDP主要是傳輸數據,屬于傳輸層,TCP確保端對端的可靠傳輸并盡量確保網絡健康運行,而UDP是簡單不可靠傳輸;IP主要解決路由問題,屬于網絡層;ARP是網絡地址轉換,主要用來轉換IP地址和MAC地址,介于數據鏈路層和網絡層之間,可以看成2.5層;ENET在這里是數據鏈路層,網卡驅動屬于這一層,主要做具體的介質傳輸,前面示例中的廣告請求抓包就是在數據鏈路層抓取。

值得注意的是,ARP在linux系統里屬于網絡層,而在RFC里是介于數據鏈路層和網絡層之間。在《TCP/IP詳解》一書里,ARP被放到了數據鏈路層。當解決實際問題的時候,我們應該把ARP放到網絡層。

604e5fce371b4f516249f64ae2f95d56.png

上圖給出使用TCPCopy在不同層發包的使用方法。如果TCPCopy從數據鏈路層發包,由于沒有享受到ARP服務,用戶需要在使用TCPCopy的時候額外加上MAC地址;而如果TCPCopy從IP層發包,則無需指定MAC地址。

本課程主要講述TCP相關案例,沒有特殊說明的話,TCP特指傳輸層的TCP。

3、什么是TCP

TCP即傳輸控制協議,是一種面向連接的、可靠的、基于字節流的通信協議。TCP的主要工作是定義端口標識應用程序的身份,實現端對端的可靠通信,并進行擁塞控制,防止互聯網崩塌。

TCP有如下關鍵特性:

992084e390939d6f2462061afe1a5ee8.png

由于TCP是面向連接的協議,所以是一種有狀態的協議,而有狀態的協議往往比較復雜,因此TCP學習起來也比較困難。

通過狀態圖來查看一下TCP狀態的復雜性:

d30b08742bf24e4e7cc2f2ca3bb8dc70.png

上圖展示了錯綜復雜的TCP狀態圖,然而現實更加復雜。

現實中的TCP狀態圖其實是這樣的:

9e0443ca5738df062af7f6129c56cf29.png

圖中,不僅SYN_RCVD狀態能夠收到reset數據包(圖中RST,reset數據包是重置連接的數據包,可以使TCP狀態瞬間變為CLOSED狀態,而CLOSED狀態是無法追蹤的),而且FIN_WAIT1、FIN_WAIT2、ESTABLISHED、SYN_SENT和CLOSE_WAIT都能被reset數據包打回到CLOSED狀態。不僅如此,TCP狀態還受到超時的影響。例如Linux系統,一旦連接處于FIN_WAIT_2,在60秒內(默認)如果沒有接收到對端的FIN數據包,系統會把此連接狀態FIN_WAIT_2直接變到CLOSED狀態。雖然Linux這樣做是為了防止攻擊,但這種超時就干掉連接狀態的做法,很可能誤殺了很多正常連接,從而使問題更加捉摸不定。

在互聯網領域,很多詭異的問題跟TCP狀態有關系,課程后續會有較多案例來講述這些靈異問題。

4、端口

當我們去連接服務器程序時,需要指明服務器端口。為什么需要端口呢?因為系統是通過端口來區分不同應用程序,TCP通過端口找到上層應用。

需要注意的是,端口號是有限的,端口號最大為65535,能夠利用的端口數量隨配置而定。例如在壓力測試過程中,一臺機器可以利用的TCP端口是有限的,能夠利用的連接(客戶端端口,客戶端IP,服務器應用端口,服務器IP地址)是有限的。為了解決這個問題,可以配置多IP地址來擴大可用連接數量。系統支持同一個端口,不同的IP地址來綁定不同的應用。Linux高版本系統下,在綁定同一個IP地址的情況下,我們還可以利用REUSEPORT機制使不同應用程序共享同一個監聽端口,這對高性能服務器開發是非常有用的。我們開發的數據庫中間件cetus就利用這個機制來解決短鏈接風暴的問題。

5、IP

網絡層的主要工作是定義網絡地址,區分網段,子網內MAC尋址,對不同子網的數據包進行路由。IP的主要作用就是在復雜的網絡環境中將數據包發給最終的目標地址。

IP是面向無連接的,是無狀態的協議。IP為什么被設計成無狀態呢?

1. 無狀態協議處理簡單

2. 通信之前無需建立連接

3. TCP已經面向連接服務了,IP層可以委托TCP來解決面向連接的問題

4. 由于不帶有狀態,互聯網路由起來更加自由,容錯性也更強

值得注意的是,現實中的IP層往往都帶有安全過濾,甚至有些路由器,防火墻等中途設備還會干涉應用(例如通過reset數據包來干涉TCP會話),為了更好的做安全檢測,IP層還增加了connection tracking,在無狀態協議上面來追蹤上層連接。這種方式提高了安全性,但有時也會帶來新的問題,我們后面有案例具體講述connnection tracking帶來的坑的故事。

6、TCP Socket

應用程序通過TCP socket接口來調用TCP服務,從而達到傳遞數據的目的。每一個TCP socket會被綁定到一個端口,TCP socket雙向都可以通信,在發送數據的同時,還可以接收數據。

值得注意的是,應用程序發送完數據,只代表通過TCP socket委托給TCP的工作已經完成,不代表發送給對端完畢,應用發送數據和TCP傳輸數據不是同步的。

7、How TCP/IP Works

當用戶通過TCP socket接口發送請求后,TCP協議模塊接管了請求傳遞,TCP先把請求拆分成一個個更小的數據分段(假設TCP offload沒有開啟的情況下),通過IP層發送出去。在IP層,這些數據分段會被封裝成IP數據包,通過數據鏈路層發送給互聯網(見下圖)。這些數據包經過互聯網的多個路由器到達目的地。由于IP網絡是無狀態的協議,每一個數據包走的路徑可能不一樣,而且到達的順序也有可能不一樣,這就要求對端的TCP需要重新組裝數據包,以確保向應用層傳遞的數據是用戶能夠識別的用戶請求,這樣服務器應用程序就可以處理用戶發起的請求了。

3d313c6559ecb63d5c14aaaf912b221f.png

下圖中,假設用戶請求拆分成兩個IP數據包

6933ba4ae75e0b9af88244205f58e6dc.png

第一個IP數據包可能經過A,B,C,G,如下圖。

ca02f83b7fb34f2a0627c2f6a346a467.png

第二個數據包可能經過A,B,E,G(在B點選擇了E節點,導致路徑不同),如下圖。

f71c405ce882cd910854fdc6b73846b7.png

導致數據包在B節點走向不同路徑的原因可能有很多種,例如C節點暫時不如E節點通暢或者臨時發生了網絡擁塞,這與在高速道路駕駛的原理差不多。

由于網絡環境多變,還可能第二個數據包先到達服務器,這時TCP會負責處理out of order的情況;如果網絡傳遞過程中,某一個路由器由于過于繁忙,把第一個數據包丟了,那么客戶端的TCP會負責重傳第一個數據包,確保服務器端的TCP能夠不會因為丟包而收不到第一個數據包。

如果用戶請求內容很大,如上傳一個大文件,就會被拆分成大量數據分段,而TCP傳輸這些數據分段的時候,往往還會考慮整個互聯網能夠接收的程度和對方能夠接收的程度,發送數據過于貪婪不僅會連累整個互聯網,對方也未必能夠接收得了,而且還可能使自己速度更慢,這有點像道路駕駛一樣,不能過于自私,遵守一定的交通規則才能使道路通暢。在互聯網傳輸數據方面,這些交通規則算法就是赫赫有名的網絡擁塞控制算法,而對方能否接收得了,則通過發送窗口的方式進行控制。總體來說,一次發送數據的大小是根據對方的接收窗口大小和擁塞控制算法來綜合決定的。

從上面可以看出,IP負責在互聯網傳輸數據,而TCP負責數據傳輸可靠并且盡量使網絡健康運行,兩者合作完成了請求的傳遞,這也是互聯網應用工作的普遍方式。

需要注意的是,TCP負責跟TCP進行交互,應用層無需去實現TCP的功能,只需要委托給TCP來完成數據傳輸,這種隔離的方式給應用層的開發/運維/測試帶來了方便,另外,當出現TCP相關問題時,解決問題的難度也大大增加。

8、TCP經驗知識

在多年實戰過程中,我們發現以下TCP經驗對工作很有幫助。總結如下:

1. 距離越遠,延遲越大,重傳概率越大

2. 網絡狀況好壞,直接影響應用程序性能

3. 不同環境,采用不同的擁塞算法

4. 擁塞控制算法是互聯網的精華,是互聯網大獲成功的關鍵因素之一

5. TCP是有狀態協議,采用異步處理

6. 抓包分析是找到TCP相關問題根本原因的利器

7. TCP客戶端和TCP服務器端之間的交互,是應用層所有應用公共的交互部分,理解了這部分原理,可以解決大量TCP相關問題。

9、IP經驗知識

在IP經驗知識方面,我們大致總結如下:

1. 數據包選擇路徑不是固定的,到達的順序也可能是亂序的

2. 安全過濾,坑多的地方

3. 無狀態協議,簡化互聯網架構,是互聯網大獲成功的關鍵因素之一

4. IP層對TCP傳遞過來的數據包很少分片處理

5. 中途設備不僅僅具備路由功能,而且還會干涉TCP會話(靈異問題的溫床)

10、結束語

TCP/IP網絡是互聯網的基石,了解TCP/IP是如何工作的,對于我們解決問題是非常有幫助的。

(來源:架構師之路)

如果您在企業IT、網絡、通信行業的某一領域工作,并希望分享觀點,歡迎給企業網D1Net投稿e8996646564cc050397b5e440788b199.png?投稿郵箱:editor@d1net.com

點擊藍色字體e0dbfa0d8af0ed8619865767280d7a47.png關注

您還可以搜索公眾號“D1net”選擇關注D1net旗下的各領域(云計算,數據中心,大數據,CIO, 企業通信 ,企業應用軟件,網絡數通,信息安全,服務器,存儲,AI人工智能,物聯網智慧城市等)的子公眾號。

企業網D1net已推出企業應用商店(www.enappstore.com),面向企業級軟件,SaaS等提供商,提供陳列,點評功能,不參與交易和交付。現可免費入駐,入駐后,可獲得在企業網D1net 相應公眾號推薦的機會。歡迎入駐。掃描下方“二維”即可注冊,注冊后讀者可以點評,廠商可以免費入

dc3c44b0f6ff18da6fc87303ea1a4415.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394495.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

消息服務器 推送技術,SSE服務器推送技術

SSE即 server send event 服務器發送事件,在在早期可能會使用ajax向服務器輪詢的方式,使瀏覽器第一時間接受到服務器的消息,但這種頻率不好控制,消耗也比較大。但是對于SSE來說,當客戶端向服務端發送請求,服…

Contest2162 - 2019-3-28 高一noip基礎知識點 測試5 題解版

傳送門 T1 單調棧 按照b排序 在家每一個物品時,判斷一下a和b的關系 如果s[sta[top]].a>s[i].b,就彈棧 記錄所有時候的height,并取最大值 T2 單調棧裸題 單調棧是干什么的?? 單調棧是記錄一個數的一側的第一個比他大…

在package.json里面的script設置環境變量,區分開發及生產環境。注意mac與windows的設置方式不一樣...

在package.json里面的script設置環境變量,區分開發及生產環境。 注意mac與windows的設置方式不一樣。 "scripts": {"publish-mac": "export NODE_ENVprod&&webpack -p --progress --colors","publish-win": "…

leetcode 978. 最長湍流子數組(動態規劃)

978. 最長湍流子數組 當 A 的子數組 A[i], A[i1], …, A[j] 滿足下列條件時&#xff0c;我們稱其為湍流子數組&#xff1a; 若 i < k < j&#xff0c;當 k 為奇數時&#xff0c; A[k] > A[k1]&#xff0c;且當 k 為偶數時&#xff0c;A[k] < A[k1]&#xff1b; 或 …

人工智能取代工作_人工智能正在取代人們的工作-開發人員是下一個嗎?

人工智能取代工作I was recently asked to comment on whether there was any point in becoming a developer right now, because AI might be doing your job very soon.最近有人要求我評論一下現在成為開發人員是否有任何意義&#xff0c;因為AI可能很快就會完成您的工作。 …

python類self_Python類中的self到底是干啥的

Python編寫類的時候&#xff0c;每個函數參數第一個參數都是self&#xff0c;一開始我不管它到底是干嘛的&#xff0c;只知道必須要寫上。后來對Python漸漸熟悉了一點&#xff0c;再回頭看self的概念&#xff0c;似乎有點弄明白了。首先明確的是self只有在類的方法中才會有&…

PHP中關于取模運算及符號

執行程序段<?php echo 8%(-2) ?>&#xff0c;輸出結果是&#xff1a; %為取模運算&#xff0c;以上程序將輸出0 $a%$b,其結果的正負取決于$a的符號。 echo ((-8)%3); //將輸出-2 echo (8%(-3)); //將輸出2轉載于:https://www.cnblogs.com/457248499-qq-com/p…

[pytorch] Pytorch入門

Pytorch入門 簡單容易上手&#xff0c;感覺比keras好理解多了&#xff0c;和mxnet很像&#xff08;似乎mxnet有點借鑒pytorch&#xff09;&#xff0c;記一記。 直接從例子開始學&#xff0c;基礎知識咱已經看了很多論文了。。。 import torch import torch.nn as nn import to…

無線服務器密碼讓別人改了,wifi密碼被改了怎么辦_wifi密碼被別人改了怎么辦?-192路由網...

wifi密碼被別人改了怎么辦&#xff1f;wifi密碼之所以被別人修改&#xff0c;是因為其他人知道了你路由器的登錄密碼。所以&#xff0c;如果發現自己wifi密碼被別人修改了&#xff0c;應該立刻登錄到路由器設置界面&#xff0c;修改路由器登錄密碼、修改wifi密碼、并調整wifi加…

[archlinux][hardware] 查看SSD的使用壽命

因為最近把16GB的SSD做成了HDD的cache&#xff0c;所以比較關系壽命問題。 使用smartctl工具。 參考&#xff1a;https://www.v2ex.com/t/261373 linux 下面只有 smartmontools 這一個工具&#xff0c;而且只對像三喪和 intel 這樣的大廠支持良好&#xff0c;其余的廠家文檔不全…

leetcode174. 地下城游戲(動態規劃)

一些惡魔抓住了公主&#xff08;P&#xff09;并將她關在了地下城的右下角。地下城是由 M x N 個房間組成的二維網格。我們英勇的騎士&#xff08;K&#xff09;最初被安置在左上角的房間里&#xff0c;他必須穿過地下城并通過對抗惡魔來拯救公主。 騎士的初始健康點數為一個正…

如何設置Windows版Go —快速簡便的指南

by Linda Gregier琳達格雷格(Linda Gregier) Another great language to add to your full-stack developer tool belt is the simple and productive general-purpose programming language of Go.添加到您的全棧開發人員工具帶中的另一種很棒的語言是Go的簡單而高效的通用編…

python計算現場得分_淺談用 Python 計算文本 BLEU 分數

淺談用 Python 計算文本 BLEU 分數BLEU, 全稱為 Bilingual Evaluation Understudy(雙語評估替換), 是一個比較候選文本翻譯與其他一個或多個參考翻譯的評價分數盡管 BLEU 一開始是為翻譯工作而開發, 但它也可以被用于評估文本的質量, 這種文本是為一套自然語言處理任務而生成的…

Unity的幾個特殊文件夾

1.以.開頭的文件夾會被unity忽略&#xff0c;資源不會被導入&#xff0c;腳本不會編譯。 2.Standard Assets和Pro Standard Assets&#xff1a;在這個文件夾中的腳本最先被編譯。 3.Editor&#xff1a;以Editor命名的文件夾允許其中的腳本訪問Unity Editor的API。如果腳本中使用…

怎么上傳文件到kk服務器,VS Code 關于SFTP上傳文件到多服務器的配置

工欲善其事&#xff0c;必先利其器&#xff01;剛學前端的時候一直用的DW來編寫代碼&#xff0c;其功能非常強大&#xff0c;但在Linux下不能用&#xff0c;所以就轉VS Code了。但是剛開始使用VS Code的時候&#xff0c;很多DW上的功能需要自己安裝擴展&#xff0c;并配置才可以…

CentOS7 Firewall NAT 及端口映射

本節介紹用CentOS7的Firewalll來做NAT以及端口映射實驗拓撲:因為我的環境里CentOS7上有KVM虛擬機需要共享網卡上網&#xff0c;所以我把網卡都添加到了橋里面&#xff0c;當然這里也可以不用橋&#xff0c;直接用物理網口&#xff1b;用nmcli創建橋&#xff0c;并添加網口到橋&…

JVM源碼---教你傻瓜式編譯openjdk7(JAVA虛擬機愛好者必看)

LZ經過一個星期斷斷續續的研究&#xff0c;終于成功的搞定了JDK的成功編譯與調試。盡管網絡上的教程也有不少&#xff0c;包括源碼中也有自帶的編譯步驟說明&#xff0c;但真正自己動手的話&#xff0c;還是會遇到不少意料之外的錯誤。 為了方便各位猿友編譯&#xff0c;LZ臨時…

leetcode1105. 填充書架(動態規劃)

附近的家居城促銷&#xff0c;你買回了一直心儀的可調節書架&#xff0c;打算把自己的書都整理到新的書架上。 你把要擺放的書 books 都整理好&#xff0c;疊成一摞&#xff1a;從上往下&#xff0c;第 i 本書的厚度為 books[i][0]&#xff0c;高度為 books[i][1]。 按順序 將…

python 微信bot_使用Tweepy在Python中創建Twitter Bot

python 微信botby Lucas Kohorst盧卡斯科斯特(Lucas Kohorst) 使用Tweepy在Python中創建Twitter Bot (Create a Twitter Bot in Python Using Tweepy) With about 15% of Twitter being composed of bots, I wanted to try my hand at it. I googled how to create a Twitter …

第五周學習進度

1.學習所花時間&#xff1a;單純Java是12個小時左右&#xff1b; 2.代碼量&#xff1a;大約300行&#xff1b; 3.博客量&#xff1a;1篇。 4.了解到的知識點&#xff1a;數據庫語言的增刪改查 5.下周計劃除了掌握課上知識外&#xff0c;還要再復習之前的關于Java的相關知識點。…