大廠面試中三次握手延伸出來n連發你受得了?

秋招面試也不記得多少家公司會有這個面試題。所以將其總結一下並分享給大家。


嘀嘀嘀。。。。一看廣東,難道是騰訊的面試,哦原來是電話面試。那就開始吧!

一、這是一次有故事的對話

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

先說說三次握手的各個狀態

二、三次握手的客戶端服務端狀態

1 先畫個圖看看有哪些狀態

在這裏插入圖片描述

嗯?這些ack seq是幹啥的呢,不急不急,我們先把tcp協議格式內容給整明白了。

2 tcp協議內容解析

  • 小賤先把tcp的頭部搬過來
    在這裏插入圖片描述
  • 然後我們來解析一下各個字段是什麼意思
字段名 字段描述
16位端口號 告知主機該報文是來自哪裏以及傳給哪個上層協議或應用程序(目的端口)的。
32位序列號 一次TCP通信(從TCP連接建立到斷開)過程中某一個傳輸方向上的字節流的每個字節的編號
32位確認號 用作對另一方發送來的TCP報文段的響應
4位頭部長度 標識該TCP頭部有多少個32bit字(4字節)。因爲4位最大能表示15,所以TCP頭部最長是60字節。
標誌位URG URG標誌:表示緊急指針是否有效。
標誌位ACK ACK標誌:表示確認號是否有效。我們稱攜帶ACK標誌的TCP報文段爲確認報文段
標誌位PSH PSH標誌:提示接收端應用程序應該立即從TCP接收緩衝區中讀走數據,爲接收後續數據騰出空間。
標誌位RST RST標誌:表示要求對方重新建立連接。我們稱攜帶RST標誌的TCP報文段爲復位報文段。
標誌位SYN SYN標誌:表示請求建立一個連接。我們稱攜帶SYN標誌的TCP報文段爲同步報文。
標誌位FIN FIN標誌:表示通知對方本端要關閉連接了。我們稱攜帶FIN標誌的TCP報文段爲結束報文段。
16位窗口大小 是TCP流量控制的一個手段。告訴對方本端的TCP接收緩衝區還能容納多少字節的數據,這樣對方就可以控制發送數據的速度
16位校驗和 由發送端填充,接收端對TCP報文段執行CRC算法以檢驗TCP報文段在傳輸過程中是否損壞
16位緊急指針 是一個正的偏移量。它和序號字段的值相加表示最後一個緊急數據的下一字節的序號

3 通過工具wireshark來驗證我們所述

  • 打開wireshark,設置捕獲網卡。
    在這裏插入圖片描述
  • 解析
  1. 第1次握手:建立連接時,客戶端發送 SYN 包到服務器端,攜帶一個序列碼給服務器端用於確認,並進入 SYN_SEND 狀態,等待服務器端確認。(發起連接狀態)

  2. 第2次握手:服務器端收到 SYN 包,首先確認客戶的SYN,並對序列碼加1處理,發送一個自己的SYN包,攜帶一個自己的序列碼,即 SYN+ACK 包,此時服務器進入 SYN_RECV 狀態。(連接接收狀態)

  3. 第3次握手:客戶端收到服務器端返回的 SYN+ACK 包,向服務器端發送確認包 ACK,並對服務器端的序列碼進行加1處理,此包發送完畢,兩端進入 ESTABLISHED 狀態,完成三次握手,之後服務器端和客戶端就開始進行數據傳輸。(建立連接狀態)

再說說Linux網絡編程的API

在這裏插入圖片描述

三、說下Linux網絡編程常用API

1 Linux網絡編程常用API

這裏至少需要知道下面的API接口。另外如果實力允許,也可以談談阻塞非阻塞,多路複用的select,poll,epoll等內容。

在這裏插入圖片描述

在這裏插入圖片描述

2 粘包現象

假設我們想將下面兩句話連續發給服務器。
(1) i respect you
(2) you respect me

ok,那麼對於服務器來說,總會有可能接收到諸如"i respect youyou respect me",這下服務器就懵了,這是啥?,因爲咋們沒有簽訂一個這樣結構的協議,所以就需要分包,那麼怎麼分也需要去組織一個比較好的結構。通常一個方法是可以在包頭存儲需要發送數據的長度,以確保接受。
在這裏插入圖片描述

四、再說說爲啥不是兩次握手或者四次握手?

爲什麼不是四次握手?下面模擬一次男女有對話
男友小藍:親愛的你能聽見我說話?下午去聽"房東的貓"演唱會(具有發送能力)
女友小小:嗯嗯,聽得到,狗子能聽見我的聲音嗎?(具有接受能力,發送能力)
男友小藍:能聽見,親愛能聽見嗎(具有接受能力)
女友小小:嗯?你是藍憨憨?我不說了我聽得見,是不是非要我再說一篇!!是想一個人去聽演唱會?

哈哈哈,這就是四次握手,多做了一次無用功。一定牢記只需要雙方具有發送和接受的能力就足矣

爲什麼不是兩次握手呢?我們繼續模擬一次對話
男友小藍:親愛的你能聽見我說話?(具有發送能力)
女友小小:我能聽見的,你能聽見我說話?(具有接受能力,發送能力)

好了,這裏男友小藍沒有接受能力,女友說的話男友小藍也就可能沒收到。後續也就不知道怎麼操作了!那到底會出什麼問題呢?

假設在cientA第一次鏈接的過程中被阻塞了。如下圖所示。那麼這個時候因爲沒有收到server的應答,所以嘗試重發,這次沒有被阻塞就連接上server了。這個時候可以談情說愛了,說完就斷開了鏈接。

在這裏插入圖片描述

這個時候剛纔被阻塞的client發現網絡情況非常好了,就去鏈接server,server不管三七二十一,來了我就給你分配資源並回復你,兩次握手完成了鏈接。但是好馬不吃回頭草呀,client以爲你早就丟失了,所以不會和server進行數據的通信。這下完蛋了,server分配的資源白分配了,這就是浪費了服務器端的資源。那麼此時網絡超級差,server是不是有可能被耗盡資源呢?

在這裏插入圖片描述

五、最後聊一聊分析網絡程序的工具

1 網絡程序調試工具的思維導圖

在這裏插入圖片描述

2 詳解各個小工具

  • tcpdump

和它類似的工具在windows中是wireshark,其採用底層庫winpcap/libpcap實現。採用了bpf過濾機制。下面我們看看提供的不同參數的含義。

參數名 含義
-n 使用IP地址表示主機。使用數字表示端口
-i 指定要監聽的端口。如果爲"-i any"表示住區所有網卡數據包
-v 輸出諸如ip數據包中的TTL更加詳細的信息
-t 不打印時間戳
-e 顯示以太網幀頭部信息
-c 僅僅抓取指定數量的數據包
-x 按照十六進制顯示數據包內容
-X 不僅僅輸出-x結果還輸出十六進制對應的ASCII字符
-s 設置抓包時的抓包長度
-w 將輸出結果定向到某個文件,一般爲pcap後綴
-r 從文件讀取數據包並顯示

知道了相關參數,下面看幾個案例

執行任務 執行命令
捕獲特定網口數據包 tcpdump -i eth0
捕獲特定個數(1000)的包 tcpdump -c 1000 -i eth0
將捕獲的包保存到文件 tcpdump -w a.pcap -i eth0
讀取pcap格式的包 tcpdump -r a.pcap
增加捕獲包的時間戳 tcpdump -n -ttt -i eth0
指定捕獲包的協議類型 tcpdump -i eth0 arp
捕獲指定端口 tcpdump -i eth0 post 22
捕獲特定目標ip+port的包 tcpdump -i eth0 dst address and port 22
捕獲DNS請求和響應 tcpdump -i eth0 -s0 port 53
匹配Http請求頭 tcpdump -s 0 -v -n -l | egrep -i “POST /|GET /|Host:”
  • lsof

列出當前系統打開的文件描述符工具。可以得知感興趣的描述符是被哪些進程使用

同樣,我們看看相關參數

參數 描述 使用方法
-i 顯示sokcet文件描述符 lsof -i @ip:port
-c 顯示指定的命令打開的所有文件描述符 lsof -c processA(查看進程A打開了多少描述符)
-t 僅顯示打開了目標文件描述符的進程pid

老規矩,上幾個例子

執行任務 命令
列出所有的網絡鏈接 lsof -i
列出所有udp的網絡鏈接 lsof -i udp
列出誰在使用某個端口 lsof -i :3306
列出誰在使用特定的tcp端口 lsof -i tcp:80
根據文件描述範圍列出文件信息 lsof -d 2-3
  • nc

nc–>“瑞士軍刀”。不知大家在滲透過程中,拿了shell有沒有使用nc搞點事兒。它用來快速構建網絡鏈接。常用來調試客戶端程序。

參數 描述
-i 設置數據包傳送的時間間隔
-l 以服務器方式運行。默認爲客戶端運行
-k 重複接受並處理某個端口上的所有鏈接
-p 以客戶端運行時強制其使用指定端口
-C 將CR和LF兩個字符作爲結束符
-u 使用udp協議。默認tcp協議
-X nc客戶端餘代理服務器通信時默認爲socks5協議。
-z 掃描目標機器某個範圍服務是否開啓

小賤上案例

執行任務 執行命令
掃描機器A端口號在30-40的服務 nc -z A 30-40
連接服務器A 端口號爲5000 nc -C A 5000
傳送文件 MachineA:nc -v -n ip port <D:\a.exe MachineB:nc -v -l -p port >E:\a.exe
  • netstat

netstat是一個網絡信息統計工具。它可以得到網卡接口上全部瞭解,路由表信息,網卡接口信息等。通常在網絡編程中我們用它來顯示TCP連接以及狀態信息。

參數 描述
-n 使用IP地址表示主機
-a 顯示結果中包含監聽的socket
-t 僅顯示TCP連接
-r 顯示路由信息
-i 顯示網卡接口數據流量
-c 每隔1s輸出一次
-o 顯示socket定時器的信息
-p 顯示socket所屬的進程的PID和名字

下面列舉幾個常用例子

執行任務 執行命令
列出所有連接 netstat -a
只列出TCP或者UDP netstat -at/netstat -au
列出監聽中的連接 netstat -tnl
獲取進程名、進程號以及用戶 ID nestat -nlpt
打印統計信息 netstat -s
netstat持續輸出 netstat -ct
打印active狀態的連接 netstat -atnp | grep ESTA
查看服務是否運行(npt) netstat -aple| grep ntp
  • vmstat

vmstat能夠實時輸出系統的進程信息,內存使用,cpu使用等資源的使用情況

參數 描述
-f 顯示系統自啓動以來執行的fork次數
-s 顯示內存相關統計信息
-d 顯示磁盤相關統計信息
-p 顯示指定磁盤分區統計信息
count 採樣次數。

看一下vmstat都有哪些輸出字段。
在這裏插入圖片描述

字段名 描述
procs r表示等待運行的而進程數目。b表示處於不可中斷睡眠狀態的進程數目
memory swpd:使用的虛擬內存量。free:空閒內存量。buff:用作緩衝區的內存量。cache:用作緩存的內存量。
swap si:從磁盤換入的內存量(/s)。so:交換到磁盤的內存量(/s)。
io bi:從塊設備接收的塊(blocks/s)。bo:發送到塊設備的塊(blocks/s)。
system in:每秒中斷的次數,包括時鐘。cs:每秒上下文切換的次數。

這裏注意哈,如果查看磁盤的更加詳細信息,有另外iostat所得到的信心就更加詳細喲

  • mpstat

能夠實時監測多處理器系統中各個cpu的使用情況。這個命令的執行需要安裝sysstat,在centos中執行yum install systat就好了。

在這裏插入圖片描述

然後我們看看各個字段什麼意思。

字段 描述
cpu 表示當前條信息屬於哪個cpu的數據
%usr 進程運行在用戶空間所佔cpu運行時間的比例
%nice nice值爲負的進程運行在用戶空間的時間佔cpu總運行時間的比例
%iowait cpu等待磁盤操作的時間佔cpu總運行時間的比例
%irq cpu用於處理硬件中斷時間佔cpu總運行時間的比例
%soft cpu用於處理軟件中斷的時間佔cpu用運行時間的比例
%steal 一對虛擬cpu。當超級管理員在處理某個虛擬cpu時,另一個等待它處理完才能運行。這段等待時間表示爲steal時間佔總運行時間的比例
%guest 運行虛擬cpu時間佔cpu總運行時間的比例
%idle 系統空閒時間佔cpu總運行時間的比例

六 結尾

好了,今天文章就到這了,如果你讀到這裏了,老鐵麼麼噠!非常感謝!
點關注,不跑路

文章會首於與微信,可以微信搜索[我是程序員小賤]第一時間查看。

後面每週都會更新幾篇面試高頻題目和自己總結的文章,如果覺得學到了一點東西,來個三連擊,點贊,關注,分享。

創作不易,各位的支持和認可,就是我創作的最大動力,我們下篇文章見!

如果本篇博客有任何錯誤,請批評指教,不勝感激 !
在這裏插入圖片描述

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