亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

TCP/IP 協(xié)議是網(wǎng)絡通信的基石,TCP/IP協(xié)議不是只有 TCP 和 IP 協(xié)議,它是整個網(wǎng)絡通信中所有協(xié)議的簡稱。

維基百科:TCP/IP協(xié)議簇

維基百科:OSI模型

# TCP/IP 參考模型維基百科
https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F
# OIS 參考模型維基百科
https://zh.wikipedia.org/wiki/OSI%E6%A8%A1%E5%9E%8B
你需要知道的TCP/IP

OSI 參考模型

圖片來自 《圖解 TCP/IP 與 OSI 參考模型》 中 TCP/IP 協(xié)議分層模型

OSI 參考模型 (七層)是個理論模型,實際我們用的是 TCP/IP (四層)模型。不過我們可以通過 OSI 參考模型來學習 TCP/IP 模型

應用層:應用程序通信細節(jié)的協(xié)議,比如常用的 HTTP。

傳輸層:主要是負責兩個節(jié)點之間數(shù)據(jù)傳輸,通信標識是 port 端口號。

網(wǎng)絡層:地址管理和路由選擇,在兩點之間找到一條最佳的通信路線,通信標識是 IP

數(shù)據(jù)鏈路層:負責物理層面鏈接的通信(同一個網(wǎng)段內(nèi))。也就是局域網(wǎng)中通過交換機鏈接的節(jié)點。通信標識是 mac 地址,網(wǎng)卡出廠自帶的標識。

物理層:將鏈路層的數(shù)據(jù)幀(字節(jié)流)轉換為電壓或光信號傳播。

網(wǎng)絡通信可以做什么呢?

redisson (一個操作 redis 的 JAVA 庫),就是使用的 netty 來做網(wǎng)絡通信連接 redis 服務的。

微服務中的服務發(fā)現(xiàn)和通信,就需要你熟悉網(wǎng)絡通信。

你要是在通信行業(yè),那就不是了解了,你連協(xié)議的規(guī)范都得很清楚,不然路由器你都整不出來,還說什么 5G 。

作為一個 Java 后端開發(fā),主要是開發(fā)偏應用層面的程序,離底層相對比較遠,熟練掌握即可,如果以后做通信行業(yè)的時候,你也一定會進一步學習的相關細節(jié)的。

TCP/IP 你不了解,也不會有多大問題,CRUD 還是沒有問題的。但是你了解了之后,日常開發(fā)定位和解決問題方面有很大助力,總之學習 TCP/IP 是一個重要不緊急的事情,根據(jù)自己目標和層次安排。

本文內(nèi)容

  • 局域網(wǎng)中各節(jié)點怎么通信
  • 介紹 IP,ICMP,ARP 協(xié)議在網(wǎng)絡層的作用及路由表的作用,及網(wǎng)段劃分,子網(wǎng)掩碼、網(wǎng)關的作用
  • 介紹交換機和路由器的作用
  • 介紹 TCP/IP 三次握手和四次揮手,TCP 中通信狀態(tài)的作用,滑動窗口
  • 介紹 tcp 包格式,ip 包格式,鏈路層 幀 數(shù)據(jù)格式

交換機與路由器

交換機

 

你需要知道的TCP/IP

交換機

交換機上有多個端口(不是 port)供計算機連接,交換機會維護端口與連接這個端口的 PC 的 Mac 地址映射表。當交換機接受到數(shù)據(jù)的時候,會根據(jù)數(shù)據(jù)包的目的 Mac 地址,發(fā)送到交換機上對應的端口上,然后經(jīng)過網(wǎng)線發(fā)送到目的 PC。

交換機連接多個電腦組成一個局域網(wǎng),交換機連接交換機又可以組成一個更大的局域網(wǎng)。

比如 A、B 交換機各有 100 個端口,A 鏈接了 99 個PC,然后 B 交換機鏈接99 個,再將其中的一個端口 A/B 之間相互連接組成一個更大的局域網(wǎng)。

路由器

路由器工作在網(wǎng)絡層,主要用于將一個網(wǎng)段數(shù)據(jù)包轉發(fā)到另一個網(wǎng)段內(nèi)。路由器上也會有個幾個 LAN 口 (Local Area Network,局域網(wǎng)),用于建立局域網(wǎng)。還會有一個 WAN(Wide Area Network,廣域網(wǎng)),連接運營商的網(wǎng)絡。

路由器也具有交換機的功能,只是 LAN 口 比較少,可以接入的電腦比較少。

當 PC 或者 手機 連接無線路由器時也會給 PC 分配一個局域網(wǎng) IP,子網(wǎng)掩碼,網(wǎng)關等。

我住的地方的網(wǎng)絡拓撲圖如下:

你需要知道的TCP/IP

 

當手機與電腦通信的時候,實際通過 LAN 口走局域網(wǎng)通信。

當手機訪問 維基百科 時,實際是通過路由器跳入到光貓網(wǎng)段,再通過光貓?zhí)氲叫^(qū)運營商的網(wǎng)絡,然后經(jīng)過多個網(wǎng)絡節(jié)點連接到維基百科的服務器上。

只要需要有 IP 地址的設備(光貓,路由器,PC,手機)都需要有網(wǎng)卡,網(wǎng)卡出廠自帶有 Mac 地址。IP 和 Mac 地址的作用后文中會介紹。

你需要知道的TCP/IP

 

交互機和路由器的區(qū)別

這部分內(nèi)容是我自己的理解,我沒有在網(wǎng)上找到資料佐證,請謹慎對待

其實交換機和路由器硬件差別不大,只是硬件上的軟件決定了它能做什么。

2 層交換機上的軟件(只有數(shù)據(jù)鏈路層)可能只做解析幀,拿到 mac 地址,然后查找當前交換機的端口對應的 mac 地址,然后從對應的端口傳遞過去。

路由器(有網(wǎng)絡層和數(shù)據(jù)鏈路層),當路由器拿到數(shù)據(jù)包的時候,發(fā)現(xiàn)目的 mac 地址不是自己,就會將數(shù)據(jù)包通過 LAN 口發(fā)送出去。

當路由器接受的數(shù)據(jù)包的目的 MAC 地址是當前路由器上 MAC地址 ,路由器就會對其解包,拿到數(shù)據(jù)包 目的 IP ,然后根據(jù) 目的 IP 匹配下一跳 mac 地址,封包為新的幀數(shù)據(jù)發(fā)送出去。

TCP/IP 通信

你需要知道的TCP/IP

 

從發(fā)送端發(fā)送數(shù)據(jù)的時候,數(shù)據(jù)經(jīng)過每層的封包,經(jīng)物理層傳送到接收端。接收端收到數(shù)據(jù)包,一層一層進行拆包,然后將數(shù)據(jù)數(shù)據(jù)發(fā)送給我接收端的應用層的應用程序。

通常我們說的第一層就是 物理層 ,第二層是 鏈路層 …...

數(shù)據(jù)鏈路層

你需要知道的TCP/IP

 

源 MAC 地址 就是發(fā)送端的 MAC 地址,目標 MAC 地址不是最終的 MAC 地址,是下一跳節(jié)點的 MAC 地址。

類型 指的是這個以太網(wǎng)幀中的數(shù)據(jù)是何種類型的數(shù)據(jù),比如 IPV4,IPV6。然后調(diào)用對應的接口進行處理。

數(shù)據(jù)鏈路層傳輸?shù)膸怯写笮∠拗频模?4-1518 字節(jié)),能傳輸?shù)臄?shù)據(jù)的最大值就是最大傳輸單元,簡稱 MTU,Maximum Transmission Unit。這個值在以太網(wǎng)中通常是 1500。

# 查看網(wǎng)卡對應的 MTU
ifconfig -a
netstat -i

網(wǎng)絡層

網(wǎng)絡層主要以 IP 協(xié)議為主,也有 ICMP,ARP(在 TCPIP 模型 中,arp 屬于網(wǎng)絡層。在 osi 七層模型,arp 數(shù)據(jù)鏈路層。)。

DNS

IP 是網(wǎng)絡層通信的標識。但是 IP 不容易記憶,所以出現(xiàn)了 域名。

訪問 DNS 可以將域名解析為 IP 。

可以在本地配置 host ,定義域名和 IP 對應關系,這樣就不用解析了。

也可以在電腦配置 DNS 解析時訪問的 ip,這樣域名解析時就會訪問這個服務。

你需要知道的TCP/IP

 

# 解析域名的 ip
dig www.mflyyou.cn

IP 基礎

IP 地址又可以分為 IPV4 和 IPV6,目前使用比較廣的是 IPV4 ,所以只介紹 IPV4。

IP 地址 由 32 (2 進制)位組成,32 位被 . 分為了四組。每組 8 位,十進制表示就是 xxx.xxx.xxx.xxx(xxx 取值在 0-255)。

IP 地址 由 網(wǎng)絡地址 (網(wǎng)段) 和 主機號 。

同一個網(wǎng)段的電腦用 2 層交互機相連,然后就可以局域網(wǎng)通信了。

同一個網(wǎng)段內(nèi),主機號不能重復,重復主機號的電腦不能上網(wǎng)。

 

為了便于區(qū)分出 IP 在那個網(wǎng)段,引入了子網(wǎng)掩碼 (netmask)。IP 地址與子網(wǎng)掩碼按位與計算可以得出網(wǎng)段,32 位 中取出網(wǎng)段所在的位,剩余就是主機號能取得值。

IP 中主機號全為 0 就是網(wǎng)段,全為 1 就是廣播地址。這兩個是不能被分配給電腦的。

IP:192.168.202.116

子網(wǎng)掩碼:255.255.252.0

網(wǎng)段為:192.168.200.0

廣播地址為:192.168.203.255

IP:192.168.201.56

子網(wǎng)掩碼:255.255.252.0

網(wǎng)段為:192.168.200.0

廣播地址為:192.168.203.255

ICMP

網(wǎng)絡層是不可靠傳輸,發(fā)送失敗的數(shù)據(jù)包,網(wǎng)絡層是不會再發(fā)一次數(shù)據(jù)包,但是會有 ICMP 包回復告訴你發(fā)包到底是什么問題。傳輸層 可以根據(jù) ICMP 來判斷是否需要重發(fā)包。

ARP

ARP 用于查找 IP 對應的MAC 地址。

目的 IP 在路由表中查詢下一跳的 IP,在查詢這個 IP 對應的 mac 地址

查詢的這個 IP 是當前網(wǎng)段內(nèi)的 ip,它會通過廣播地址發(fā)送給當前網(wǎng)段內(nèi)所有主機,收到這個協(xié)議的主機會判斷是否是當前主機,是的話就會恢復當前 ip 對應的 MAC 地址。

你需要知道的TCP/IP

 

通信過程分析

你需要知道的TCP/IP

 

當我在瀏覽器輸入 wwww.mflyyou.cn 的時候:

1、先解析域名(DNS) www.mflyyou.cn 為 IP (目的 IP: 47.104.168.20)

2、將目的 IP 與本地路由表中的子網(wǎng)掩碼進行按位與,計算出網(wǎng)段與 Destination 匹配,看哪個匹配度更高,走哪個條目。都沒有匹配到走默認條目(0.0.0.0)

# 查看路由表
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.31.1    0.0.0.0         UG    100    0        0 eth0

3、然后用 arp 查詢(有緩存可不查,走緩存)192.168.31.1 對應的 mac 地址

4、數(shù)據(jù)鏈路層封裝以太網(wǎng)幀數(shù)據(jù)包中的目的 Mac 地址址就是 192.168.31.1 對應的 Mac 地址,然后將數(shù)據(jù)幀發(fā)送到下一個節(jié)點(這也就常說的下一跳,數(shù)據(jù)包發(fā)送只是找到當前接節(jié)點的下一個節(jié)點)

5、到下一個路由器節(jié)點,路由器解包,看是發(fā)給自己的數(shù)據(jù)包(根據(jù)幀中的目的 MAC 地址與自己的 MAC 地址比較),不是就丟棄了;是的話就會解包拿到 目的 IP (47.104.168.20),然后在當前路由器上根據(jù)路由表查詢下一跳,發(fā)送給下一個節(jié)點;。。。。 直到目的服務器,或者發(fā)送的包 TTL 為 0

6、發(fā)到目的服務器的網(wǎng)卡上,網(wǎng)卡將數(shù)據(jù)復制到內(nèi)核緩沖區(qū),應用程序從緩沖區(qū)中讀取數(shù)據(jù)

IP 數(shù)據(jù)格式

IPv4 數(shù)據(jù)結構

你需要知道的TCP/IP

 

圖來自《圖解 TCP/IP》

  • 版本(Version):4 bit 構成,代表當前 IP包是哪個版本,IPv4 或者 IPv6,為 4 時表示當前是 IPv4。
  • 首部長度(Internet Header Length):由 4 bit 構成,一般 20字節(jié)大小。
  • 標識(Identification):用于分片重組用,值相同的屬于同一個 IP 數(shù)據(jù)包
  • 標志(Flags):用于判斷是否還有分片。
  • 總長度(Total Length):16 個字節(jié),IP 數(shù)據(jù)包總的長度,最長可為 65525 字節(jié)。
  • 分段偏移(Fragment Offset):表示這個包在原來 IP 包中的位置。
  • 生存時間 TTL(Time To Live): IP 包在路由轉發(fā)中存活的時間,被路由轉發(fā)一次,次數(shù)減 1,為 0 時,數(shù)據(jù)包被丟棄。
  • 掛載協(xié)議標識 (Protocol):記錄數(shù)據(jù)包中 Data(實際發(fā)送的數(shù)據(jù))是什么類型的數(shù)據(jù),1 標識 ICMP, 4 標識 IP, 6標識 TCP, 17 標識 UDP。根據(jù)這個掛載協(xié)議程序就知道調(diào)用哪些接口來進行后續(xù)的處理了。

數(shù)據(jù)鏈路層中以太網(wǎng)數(shù)據(jù)幀的 MTU 是 1500 字節(jié),限定了 IP 數(shù)據(jù)包最大為 1500 字節(jié)。然后去掉 IP 包首部 20 字節(jié),一般 IP 數(shù)據(jù)包發(fā)送的數(shù)據(jù)為 1480 字節(jié)。

當我們發(fā)送一個 3058 字節(jié)的 IP 數(shù)據(jù)包時,這顯然大于了數(shù)據(jù)鏈路層的 MTU (1500 字節(jié))。所以網(wǎng)絡層會對大于鏈路層MTU 的數(shù)據(jù)包進行分片。拆分一個一個的1500 的數(shù)據(jù)包發(fā)送接收端,接收端接收到這三個包,在匯聚成一個完成的,在調(diào)用傳輸層接口。

# 會發(fā)送 3050 字節(jié)數(shù)據(jù)與 8 字節(jié)的 ICMP 首部,這個命令會總共發(fā)送 ip 數(shù)據(jù)大小 3058 字節(jié)。
ping -s 3050 www.mflyyou.cn
你需要知道的TCP/IP

 


你需要知道的TCP/IP

 


你需要知道的TCP/IP

 


你需要知道的TCP/IP

 

通過 wireshark 抓包可以看到,IP 數(shù)據(jù)包的首部長度占了 20 字節(jié),實際每次發(fā)送數(shù)據(jù)為 1480 字節(jié),最后一次發(fā)送了 98 字節(jié)。

從 Fragment 和 Identification 可以看到這三個包屬于同一個 IP 數(shù)據(jù)包,并且從 Fragment offset 能將這三個包合成一個完成的網(wǎng)絡層數(shù)據(jù)包。

傳輸層 TCP

TCP 是面向鏈接的,可靠的,全雙工協(xié)議。

面向連接就是發(fā)送之前,需要建立一個鏈接通道,數(shù)據(jù)都是在這個鏈接中發(fā)送。

TCP 協(xié)議中發(fā)送端會記錄發(fā)送的那些數(shù)據(jù)包被客戶端收到了。接收端接受數(shù)據(jù)之后,會回復一個 ACK 包(由數(shù)據(jù)格式中的控制位決定),確認應答號告訴發(fā)送端哪些數(shù)據(jù)包接收到了。

發(fā)送端發(fā)送了數(shù)據(jù)包之后,這個包會有一個重發(fā)倒計時,在這個倒計時內(nèi)沒有收到接收端回復 ACK 包,就會再重發(fā)一個數(shù)據(jù)包。如果是 HTTP 請求 ,就相當于同樣的數(shù)據(jù)請求了兩次。

我們知道支付接口都要求冪等性,有一部分原因是因為這個超時重發(fā)。發(fā)送端發(fā)送了請求,接收端處理好業(yè)務之后回復的 ACK 包超時,發(fā)送端超時重發(fā)這個請求。如果不保證接口的冪等性,那么扣錢就會扣兩次。

我們要做的就是保證這個重發(fā) n+1 次不再扣用戶的錢,一般會用一個 token 來判斷是不是重復請求,重復就不走扣款處理了,直接返回已經(jīng)支付,保證接口的冪等性。或者用一個賬單流水來保證冪等性。

連接既然需要建立,那么也會有連接斷開。斷開連接需雙方協(xié)商好之后斷開連接,不能單方面關閉而不管對方。因為建立連接之后占用的計算機資源需要釋放掉。你單方面強制斷開連接釋放了資源,但是對方不知道需要斷開連接,分配的計算機資源一直占用那就是不可靠協(xié)議了。所以 TCP 有四次揮手斷開連接。

全雙工就是連接兩邊都可以主動發(fā)送接受數(shù)據(jù),而不是輪訓訪問有沒有數(shù)據(jù)到達。

TCP 數(shù)據(jù)格式

首先我們要先了解 TCP 數(shù)據(jù)格式,才能更容易知道 TCP 的工作原理。

你需要知道的TCP/IP

 

源端口號(Source Port)

占用 2 個字節(jié)。標識 發(fā)送端 程序的端口號,當接收端需要回復消息的時候,需要帶上這個端口號。

目的端口號(Destination Port)

占用 2 個字節(jié)。標識 接收端 程序的端口號,可以傳遞給監(jiān)聽在這個端口的程序

控制位(Control Flag)

占用 6 位,不滿一個字節(jié)。標識當前 TCP 包是什么包,在通信過程中有一些特殊作用。

SYN

表示希望建立三次握手鏈接,并初始化序列號。

ACK

對收到數(shù)據(jù)包的應答確認。接收端接受數(shù)據(jù)之后,會回復 ACK 包,發(fā)送端從其上 確認應答號 知道接收端哪些數(shù)據(jù)已經(jīng)接受了。

FIN

表示沒有數(shù)據(jù)發(fā)送了,希望斷開連接

PASH

接收端接收到這個數(shù)據(jù)包需要立刻傳遞給應用層,不能等待接收更多的數(shù)據(jù)包

RET

鏈接出現(xiàn)異常,需要強制斷開連接

URG

表示包中有需要緊急處理的數(shù)據(jù)

序列號(Sequence Number)

占用 4 個字節(jié)。TCP 三次握手的時候,發(fā)送端和接收端各自初始化(隨機的)自己的 `序列號。

我們可以這樣理解,發(fā)送端發(fā)送的數(shù)據(jù)就是一個字節(jié)數(shù)組,這個數(shù)組中每個字節(jié)都有一個 序列號。

發(fā)送端和接收端都有自己的序列號,并且不相同,在三次握手的時候自己初始化,然后告知對方。

確認應答號(Acknowledgement Number)

占用 4 個字節(jié)。確認應答號 也是指的序列號,指的是期望發(fā)送端下次發(fā)送的序列號,這個序列號(確認應答號)之前的數(shù)據(jù)已經(jīng)接受處理了。

下圖是我抓包建立三次鏈接,然后我發(fā)送三次 1n 數(shù)據(jù)。

三次握手,發(fā)送端通過發(fā)送 SYN 包,發(fā)送自己的初始化序列號(893189542),然后發(fā)送的每個字節(jié)都會有一個序列號。

接收端發(fā)送 ACK 包中的 確認應答號,指明這個序列號之前的數(shù)據(jù)我已經(jīng)接受了。

你需要知道的TCP/IP

 

窗口大小(Window Size)

窗口大小適用于流控的。發(fā)送端不能一直發(fā)送消息,需要根據(jù)接收端的接受能力來調(diào)整發(fā)包的速率。

你需要知道的TCP/IP

 

內(nèi)核會為每個 TCP/IP 分配讀寫緩沖區(qū),網(wǎng)卡會從寫緩沖區(qū)中把數(shù)據(jù)取走,然后發(fā)送。

TCP/IP 是可靠連接,所以它需要記錄哪些數(shù)據(jù)發(fā)送已被對方接受了(由確認應答號可以知道),接受的數(shù)據(jù)會被淘汰掉,節(jié)省內(nèi)存空間。

窗口大小作用:接收端會通過 ACK 告訴發(fā)送端調(diào)整窗口大小。

當窗口中的數(shù)據(jù)全都是已發(fā)送未確認數(shù)據(jù)時,發(fā)送端不能再發(fā)送新的數(shù)據(jù),必須等待窗口空出位置來。

你需要知道的TCP/IP

 

當有一個數(shù)據(jù)包被確認了,發(fā)送端就可以發(fā)送新的數(shù)據(jù)包。已發(fā)送未確認數(shù)據(jù)會在超時的時候重新發(fā)包。

校驗和 (Checksum)

占用 2 個字節(jié)。校驗和 用于校驗數(shù)據(jù)包是否損壞。每個數(shù)據(jù)包都一個校驗和 ,接收端接收到數(shù)據(jù)之后,使用相同的算法對數(shù)據(jù)計算出一個 hash值,然后跟數(shù)據(jù)包的校驗和比較,不一樣說明數(shù)據(jù)在傳輸過程中損壞了,接收端會丟棄這個包,等待發(fā)送端重新發(fā)這個包。

TCP 中 MSS

鏈路層能發(fā)送的最大以太網(wǎng)幀為 1500 字節(jié),MTU 為 1500。

IP 數(shù)據(jù)包能發(fā)送的最大數(shù)據(jù) = MTU - IP 首部大小(一般 20 字節(jié)),IP 數(shù)據(jù)包超過這個 1500 字節(jié)會分片

TCP 傳輸數(shù)據(jù)以段 (Segment) 為單位。

TCP 為了避免分片,會主動將數(shù)據(jù)分片之后交給網(wǎng)絡層。 TCP 能傳輸?shù)淖畲蠓侄危ㄖ皇菙?shù)據(jù)不包括首部)稱之為 Max Segment Size,簡稱為 MSS。

MSS = MTU - IP 首部大小 - TCP 首部大小

在以太網(wǎng)中 TCP 的 MSS = 1500(MTU) - 20(一般 IP 首部大小) - 20(一般 TCP 首部大小)= 1460,這個值需要根據(jù)首部計算

你需要知道的TCP/IP

 

MSS 值在三次握手時,會通過 MTU 計算的。

TCP 三次握手建立連接

你需要知道的TCP/IP

 

圖片來自 碼出高效:Java 開發(fā)手冊

為什么是三次握手建立連接呢?很多面試官也會問。這其實是可靠連接的最少握手次數(shù)。

你需要知道的TCP/IP

 

圖片來自 碼出高效:Java 開發(fā)手冊

這里還有個 全連接隊列和半鏈接隊列 的知識點

http://mflyyou.cn/2020/07/18/cong-linux-nei-he-li-jie-java-zhong-socket-tong-xin/#toc-heading-5

 

TCP 四次揮手斷開連接

你需要知道的TCP/IP

 

圖片來自 碼出高效:Java 開發(fā)手冊

CLOSE_WAIT 是被動斷開連接的一方收到對方 FIN 包之后,回復 ACK 之后進入的狀態(tài)。進入 CLOSE_WAIT 之后不會接受數(shù)據(jù)了,進行已收數(shù)據(jù)的業(yè)務處理之后,在發(fā)送一個 ACK+FIN,進入 LASK_ACK,然后等待對方發(fā)送 ACK,超時沒有等到,會重試發(fā)送(內(nèi)核可以配置重試發(fā)送次數(shù))。當你發(fā)現(xiàn)服務端有大量的 CLOSE_WAIT 鏈接,服務端的代碼有問題,需要排查。

TIME_WAIT 的連接需要等待 2MSL再斷開連接。

TIME_WAIT 的連接多的話,服務端也要優(yōu)化,不然這個鏈接會占用很長時間,在高并發(fā)的時候,資源連接釋放的慢,導致不能分配新的鏈接。

MSL 為 Maximum Segment Lifetime,在 centos 中 MSL 默認值為 60s,2MSL=2*60=120s

# sysctl -a | grep tcp_fin_timeout
# 推薦小于 30,也不能太小,15-30
net.ipv4.tcp_fin_timeout = 60

A 機器 TIME_WAIT 鏈接 會在 120 s 之后才能釋放。這個是為了保證 B 機器 能接收到最后一個來自 A 機器 的ACK。如果 B 機器 處于 LAST_ACK 狀態(tài)的連接沒有收到 A 機器 發(fā)來的 ACK 的話,會重試發(fā)送一個 FIN+ACK。這個 2MSL 也是為了最大限度保證 B 機器正常關閉。

三次握手 建立連接 和 四次揮手 斷開連接需要結合抓包工具自己分析一下,理解會更深刻。

網(wǎng)絡抓包

Wireshark 抓包分析是很厲害的,mac os 和 linux 都有命令行程序 tshark,可以在服務器用 tshark 抓包,拿到本地來分析。

抓包的時候一定要指定抓什么包,什么包都抓的話,一會你的電腦內(nèi)存就飆升好多(別問我為啥知道,問就是 30g 內(nèi)存都讓它吃了)。

Wireshark 有個 抓包過濾器 和 顯示過濾器。抓包的時候指定抓什么包這是 抓包過濾器 的作用,抓包之后顯示顯示那些內(nèi)容那是 顯示過濾器 的作用

# -i 指定那個網(wǎng)卡 
# -f 指定抓包過濾器
# -Y 顯示過濾器
# -w 指定抓包數(shù)據(jù)到文件,沒有 -w 輸出屏幕
# -V 顯示 TCP/IP 每層包的詳細信息,建議將抓包的文件在圖形化界面中查看,不指定 -V
tshark  -i en0 -f "tcp" -Y "http"

# 抓取訪問 www.mflyyou.cn 的包
tshark  -i en0 -w a.pcap -f "host www.mflyyou.cn"

# 指定抓那個協(xié)議 tcp,ip,icmp,arp,udp
tshark  -i en0 -f "tcp"


# host 指定域名或者 ip
# port 指定端口
# 訪問 www.mflyyou.cn 的包,或者 icmp. ping www.baidu.com 也會被抓到
tshark  -i en0 -f "host www.mflyyou.cn || icmp"
tshark  -i en0 -f "port 80"

# 條件之間支持邏輯運算符 || && !
# 抓取 ssh 鏈接的包
tshark  -i en0 -f "host www.mflyyou.cn && port 22"

參考資料

《圖解 TCP/IP》

linux-tcp 說明

鳥哥私房菜:基礎網(wǎng)絡的概念


本文由 張攀欽的博客 http://www.mflyyou.cn/ 創(chuàng)作。 可自由轉載、引用,但需署名作者且注明文章出處。

歡迎關注我的微信公眾號【Mflyyou】獲取持續(xù)更新。

github.com/zhangpanqin/MFlyYou 收集技術文章及我的系列文章,歡迎 Star。

分享到:
標簽:TCP IP
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定