自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

抓不住三次握手的過程?那跟我一塊來抓個包吧!

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
何為「協(xié)議」(protocol)?「協(xié)」的本意是指多人合作,而后面的那個「議」在古漢語中的意思是一種文體,那么合起來就是多人合作共同遵守的一種文體,后來引申為雙方共同約定遵守的一種規(guī)則。

前段時間在忙一個機器人通信的項目,其中用到一個重要的協(xié)議族就是TCP/IP (Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/國際互聯(lián)協(xié)議),我一直覺得TCP/IP協(xié)議設(shè)計的真的是太巧妙了,可以說是這個星球上最偉大的通信協(xié)議,小到微信的即時通訊,大到航空航天等自動控制工業(yè)領(lǐng)域,它的身影無處不在,正是有了TCP/IP,我們發(fā)送的每一條互聯(lián)網(wǎng)信息才能安全無損地到達對方(比如你有沒有想過你身在北京,打開微信給身在上海的朋友發(fā)個祝福短語這期間你的信息究竟經(jīng)歷了什么,為什么能準確無誤地到達),一個TCP/IP協(xié)議,半部計算機網(wǎng)絡(luò)史,所以我覺得每一位計算機從業(yè)者或者計算機相關(guān)從業(yè)者都應(yīng)該花點時間研究一下TCP/IP協(xié)議。

大道至簡,今天我們使用一個抓包工具Wireshark來抓個數(shù)據(jù)包,然后對其抽絲剝繭,逐步來揭開TCP/IP的神秘面紗吧!

圖片

1997年12月,美國總統(tǒng)布什為TCP/IP之父羅伯特·卡恩(中間)頒發(fā)的美國國家技術(shù)勛章。

圖片

因特網(wǎng)起因于美蘇爭霸期間美國國防部準備研究的一種分散的指揮系統(tǒng),由無數(shù)節(jié)點構(gòu)成,當若干節(jié)點被摧毀后,仍然能夠通過其他節(jié)點互相通信。它是一種拓撲結(jié)構(gòu),你從北京發(fā)送的信息到上??梢宰叨喾N路徑,TCP/IP的神奇之處就在于它能夠讓你的信息準確無誤地到達。

何為「協(xié)議」(protocol)?「協(xié)」的本意是指多人合作,而后面的那個「議」在古漢語中的意思是一種文體,那么合起來就是多人合作共同遵守的一種文體,后來引申為雙方共同約定遵守的一種規(guī)則。生活中的協(xié)議有很多,比如你剛畢業(yè)的時候簽訂的三方協(xié)議,還有租房的時候有租賃協(xié)議,再說遠一點,秦始皇統(tǒng)一中國后為了方便全國的交流,制定了「車同軌,書同文」的規(guī)則,這應(yīng)該是中國歷史上最早的國家標準了吧,這也是一種協(xié)議,還有,你看諜戰(zhàn)片,雙方傳遞信息的時候都有口號,這都是事先約定好的,都是一種協(xié)議,雙方必須遵守。

有了協(xié)議,就大大方便了我們的交流,比如我們在打電話的時候一般都會說聲“喂,你好”,等對方確認應(yīng)答后才說明雙方確實都通了,然后開始正式通話,而對于TCP來說也是這樣的,TCP在建立連接的過程中要進行三次握手,雙方完全確認無誤后才會互相通信:

圖片

三次握手示意圖

帶著這張圖片的信息,讓我們展開抓包之旅吧!

抓包前的準備工作

第一步,首先我們下載一個抓包軟件Wireshark,這個軟件百度一下,網(wǎng)上很多,直接下載即可;

第二步,然后我們在自己的電腦上ping一下百度的域名:www.baidu.com,這樣就能知道百度服務(wù)器的IP地址,當然百度在全國肯定不止一臺服務(wù)器,所以每個人ping出的地址可能不一樣,比如我ping出的是180.101.49.12 。

圖片

第三步,我們打開抓包軟件,在選項里面選擇你的網(wǎng)絡(luò)接口,然后點擊開始,Wireshark就開始幫你抓包了;

圖片

第四步,我們打開瀏覽器,輸入剛才ping到的百度服務(wù)器的IP地址,輸入地址欄按回車,這樣就打開百度首頁了,其實我們平常輸入的網(wǎng)址也是經(jīng)過DNS服務(wù)器解析后轉(zhuǎn)化成IP進行訪問的。沒錯,我們就是通過訪問一個百度網(wǎng)址來抓取在鍵入回車后雙方的報文信息的。

圖片

第五步,我們在抓包軟件搜索框內(nèi)輸入 ip.addr == 180.101.49.12 and tcp 指令來幫助我們過濾掉多余的信息:

圖片

好了,可見我們抓取了很多條信息,但是我們只需要前三條即可,因為前三條就是雙方建立連接(三次握手)過程中互相傳遞的報文信息。

在分析這三條報文前,我們回憶一下TCP/IP每層網(wǎng)絡(luò)模型中的報文結(jié)構(gòu):

圖片

每層模型對自己的數(shù)據(jù)加包頭后發(fā)給下一層:

圖片

這是微信發(fā)送消息的模型(所有TCP/IP協(xié)議都是這樣),當然微信肯定不是端對端直接傳送到另一個手機,而是先傳送到騰訊服務(wù)器,再轉(zhuǎn)推給對方,不過原理是一樣的。

可見每層都是膠囊化的數(shù)據(jù),經(jīng)過加工后(一般都是加上報頭)然后傳送給下一層,最終由物理層的傳送介質(zhì)(比如光纖)傳送給對方電腦,對方收到后再反過來解析,剝開每一層的報頭,最終露出數(shù)據(jù)部分,這才是我們真實要的數(shù)據(jù)。所以,我們抓到的包都是在最下面的以太網(wǎng)幀,包含幀頭、幀尾、IP頭部、TCP頭部的數(shù)據(jù)包,所以我們必須先從最后一層分析。

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

圖片

在數(shù)據(jù)鏈路層我們收到的以太網(wǎng)幀頭部結(jié)構(gòu)如下(下面這張圖片為了描述方便,寬度我與位長度我沒有按照比例來畫):

圖片

簡要解釋一下幾個字段的含義:

  • 前導(dǎo)同步碼

提醒接收系統(tǒng)即將有幀到來,七次寫入 10101010 ;

  • 幀開始分界符

表示幀的發(fā)送從下一個數(shù)據(jù)報正式開始,二進制數(shù)序列為 10101011 ;

  • 幀的長度 / 類型

內(nèi)容為幀長度(單位為字節(jié))或者交給上層協(xié)議的信息。具體是哪種內(nèi)容,取決于以太網(wǎng)的種類。

我們先來看第一次握手的數(shù)據(jù)

圖片

第一個紅框 b0 95 8e 0b 15 38 代表目標MAC地址,也就是百度服務(wù)器的網(wǎng)卡地址;

第二個紅框 10 63 c8 ff ff ff 代表源MAC地址,也就是我自己電腦的網(wǎng)卡地址,后三個字節(jié) ff ff ff 是我虛擬的,包括上面圖片中我也打了馬賽克,為什么,因我怕黑客知道我的網(wǎng)卡地址后攻擊我的電腦;

第三個紅框 08 00 代表的是 IPv4 協(xié)議。

等等,你可能會問,幀頭的前導(dǎo)同步碼與幀開始分界符怎么沒有顯示呢?

這是因為在物理層上網(wǎng)卡要先去掉前導(dǎo)同步碼和幀開始定界符,然后對幀進行CRC檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬件地址是否符合自己的接收條件(目的地址是自己的物理硬件地址、廣播地址、可接收的多播硬件地址等),如果符合,就將幀交“設(shè)備驅(qū)動程序”做進一步處理。這時我們的抓包軟件才能抓到數(shù)據(jù),因此,抓包軟件抓到的是去掉前導(dǎo)同步碼、幀開始分界符、FCS之外的數(shù)據(jù)。

 網(wǎng)絡(luò)層

圖片

我們先來看網(wǎng)絡(luò)層,也就是 IP 層的頭部結(jié)構(gòu):

圖片

先來大致解釋一下每個字段的含義:

  • 版本(version)

如果是 IPv4 則填入 4 ,如果是 IPv6(當然報頭結(jié)構(gòu)跟 IPv4 結(jié)構(gòu)不一樣)則填入6。

  • 頭長度(Header Length)

IP 報頭的大小 ,頭部長度是指IP報頭的總長度,因為有Option可選部分,通常為20字節(jié),范圍在20--60字節(jié),注意,該字段單位為32位字(1個32位字為4字節(jié)),因此當ip報頭長度為1111(15)時是最大60(15*4)字節(jié),一定要注意,這個字段的單位比較特殊,容易弄錯。

  • 服務(wù)類型(Differentiated Services Field)

顯示發(fā)送信息時的優(yōu)先情況。

  • 數(shù)據(jù)包總長度(Total Length)

IP 報頭與數(shù)據(jù)的整體大小,表示此IP報頭和數(shù)據(jù)的之和的總長度。總長度16位,一個數(shù)據(jù)最大長度65535字節(jié);鏈路只允許1500字節(jié),超過的話需要進行MTU分片。一個數(shù)據(jù)包由IP報頭和數(shù)據(jù)兩部分組成,而IP報頭為20---60字節(jié),所以不會有一個數(shù)據(jù)包里純數(shù)據(jù)超過1480字節(jié)。

  • 標識符(Identification)

將分割后的 IP 數(shù)據(jù)包復(fù)原時使用的值,與標記字段和偏移字段用于IP報文分片。原始報文大小超過MTU(<1480B)就必須將原始數(shù)據(jù)進行分片,每個分片小于MTU,對同一原始文件被分片的報文打上相同的標記,也用來判斷流量是否來于同一主機。IP軟件在存儲器中維持一個計數(shù)器沒生產(chǎn)一個數(shù)據(jù)包,計數(shù)器就加1,并賦予標識字段。數(shù)據(jù)報文進行分片處理后每個分片的標識值都與原數(shù)據(jù)包的標識值相同,接收端具有同標識值的分片就能最終正確重組為原數(shù)據(jù)。

  • 旗標(Flags)

關(guān)于數(shù)據(jù)包分割的信息:

第一位沒有被使用;

第二位不分片(DF),當DF位置為1時表示路由器不能對報文進行分片處理;第三位多分片(MF),當路由器對報文進行分片時,除了最后一個分片的MF位設(shè)置為0外,其他所有分片MF位置為1,以便接收者直到收到MF位為0的分片為止。

圖片

例如,如果數(shù)據(jù)包被分成兩段,那么第一個flags就是101,第二個flags就是100.

  • 分片偏移(Fragmentation offset)

被分割的數(shù)據(jù)的順序,標識分片在分組中的位置。

  • 生存時間(Time to live, TTL)

允許經(jīng)過最大的路由器數(shù)量,即數(shù)據(jù)包能傳多少跳。不同操作系統(tǒng)TTL的默認最大值會有所不同,目的是防止路由成環(huán)時IP數(shù)據(jù)被無限轉(zhuǎn)發(fā),每經(jīng)過一個路由器TTL值減1,TTL為0時丟棄該分組。

  • 協(xié)議(Protocol)

上一級協(xié)議,標識數(shù)據(jù)攜帶的數(shù)據(jù)是何種協(xié)議,標識傳輸層地址或協(xié)議號,如1代表ICMP,6代表TCP,17代表UDP.

  • 包頭校驗和(Header checksum)

確認 IP 包頭是否損壞的數(shù)值,用于校驗檢查IP報頭是否有出入。

  • 選項(Option)

可選字段(0--40B)Option字段很少使用,用于控制,轉(zhuǎn)發(fā)要求,測試等。

圖片

網(wǎng)絡(luò)層的信息比較多,我們只撿幾個重要的信息來說一下:

第二行的 c0 a8 00 65 轉(zhuǎn)化成十進制就是 192.168.0.101 這是我電腦的 IP ,注意這里是局域網(wǎng) IP , 后面的 b4 65 31 0c 轉(zhuǎn)化成十進制就是180.101.49.12,是目標 IP ,也就是百度服務(wù)器的 IP。

傳輸層

圖片

傳輸層的功能是保證數(shù)據(jù)可靠地從發(fā)送結(jié)點發(fā)送到目標結(jié)點,我們看一下它的頭部結(jié)構(gòu),已經(jīng)能夠看到攜帶的握手信息了。

圖片

  • 序列號(Sequence Number)

表示在所有的數(shù)據(jù)中,此數(shù)據(jù)是第幾個

  • 確認應(yīng)答號(Acknowledgment Number)

表示即將接收的下一個數(shù)據(jù)是第幾個

我們再看抓到的包數(shù)據(jù),再剝一層,把 IP 頭去掉,先看第一次握手:

圖片

我們可以看到:第一次握手的過程中,客戶端隨機生成了一個序列號,數(shù)值挺大的,然后將狀態(tài)控制碼中的 SYN 置為1,發(fā)送給服務(wù)端。

第二次握手:

圖片

在服務(wù)端收到客戶端的報文后,服務(wù)端再給客戶端一個應(yīng)答,由于是服務(wù)端給客戶端打招呼,因此端口號互換一下,這邊服務(wù)端也隨機生成一個序列號,同時將第一次握手收到客戶端的序列號加1,作為確認序列號發(fā)送過去,同時將狀態(tài)控制碼的ACK與SYN置為1,發(fā)送給客戶端。

第三次握手:

圖片

第三次握手是客戶端在收到服務(wù)端的回應(yīng)后,客戶端再一次回應(yīng)??梢钥吹?,序列號就是第二次握手服務(wù)端發(fā)來的確認應(yīng)答序列號,而第三次握手客戶端的確認序列號就是第二次握手服務(wù)端發(fā)來的確認序列號加1。

這樣,三次握手就完成,雙方建立連接,可以互相通信了。

好了,以上就是今天的全部內(nèi)容了,其實三次握手只是TCP里面的冰山一角,真正傳輸過程中還涉及到非常多的知識,比如超時重傳、校驗、窗口機制等等,不過今天先說到這里吧,基礎(chǔ)薄弱的同學(xué)可以先消化一下,后面的知識等有時間再給大家說。

責(zé)任編輯:武曉燕 來源: 編碼珠璣
相關(guān)推薦

2021-03-08 18:08:08

TCP Connect 協(xié)議

2017-09-25 21:27:07

TCP協(xié)議數(shù)據(jù)鏈

2020-12-08 06:34:16

TCP握手SYN 報文

2023-09-07 16:46:54

TCP數(shù)據(jù)傳遞

2015-10-13 09:42:52

TCP網(wǎng)絡(luò)協(xié)議

2020-03-02 14:41:04

運維架構(gòu)技術(shù)

2022-10-19 14:08:42

SYNTCP報文

2024-01-12 08:23:11

TCPACK服務(wù)器

2021-08-09 07:26:34

Blazor路由開發(fā)

2020-01-09 09:31:05

三次握手四次揮手 TCP

2024-10-09 20:54:16

2020-01-07 22:15:43

TCP三次握手丟包

2022-10-10 07:34:36

TCP三次握手區(qū)塊鏈

2025-02-13 00:00:00

TCP網(wǎng)絡(luò)通信

2019-06-12 11:26:37

TCP三次握手四次揮手

2023-11-01 08:04:08

WiresharkTCP協(xié)議

2022-07-07 09:00:17

TCP 連接HTTP 協(xié)議

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制協(xié)議

2020-02-17 10:10:43

TCP三次握手四次揮手
點贊
收藏

51CTO技術(shù)棧公眾號