計算機網路基礎
- 網路協議
- 1.OSI七層模型
- 2.TCP/IP四層模型
- 3.傳輸層
- 埠號
- TCP協議
- 1.確認應答ACK機制(保障TCP穩定的核心機制)
- 2.超時重傳
- 3.連接管理
- 4.滑動視窗
- 5.流量控制
- 6.擁塞控制
- 7.延遲應答
- 8.捎帶應答
- 9.面向位元組流
- 10.沾包/半包問題
- TCP例外情況
- TCP小結
- UDP協議
- 二者區別
- 4.網路層
- IP協議
- IP協議格式引數說明
- IP網段劃分
- 5.資料鏈路層
- 以太網
- MAC地址
- ARP協議
- 6.網路傳輸流程
- 7.瀏覽器中輸入一個url后會經歷什么?
- 8.計算機網路試題
網路協議
協議:協議就是一種約定,就好比網友見面,彼此協商胸口插枝玫瑰花見面,這就是一種提前的約定,也可以稱之為協議,
舉例:
計算機生產商有很多,作業系統也有很多,計算機網路硬體設備也有很多,那么如何讓不同廠商生產的計算機之間能夠相互順暢通信呢?就需要一個標準去約定,這個標準就是網路協議,
1.OSI七層模型
- OSI(Open System Interconnection,開放系統互連)七層網路模型稱為開放式系統互聯參考模型,是一個邏輯上的定義和規范,

2.TCP/IP四層模型
TCP/IP通訊協議采用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求,四層分別是:
應用層:負責應用程式之間的溝通,如簡單電子郵件傳輸SMTP、檔案傳輸協議FTP、網路遠程訪問協議Telnet等,網路編程指的就是針對應用層的編程,傳輸層:負責兩臺主機的資料傳輸,如傳輸控制協議TCP,能夠保證資料可靠地從源主機發送到目標主機,網路層:負責地址管理和路由選擇,例如在IP協議中,通過IP地址標識一臺主機,并通過路由表地方式規劃出兩臺主機之間的資料傳輸的線路(路由),能夠確保資料可靠的從源主機發送到目標主機,資料鏈路層:負責設備之間的資料幀的傳送和識別,例如網卡設備的驅動、幀同步(就是說從網線上檢測到什么信號算作新幀的開始)、沖突檢測(如果檢測到沖突就自動重發)、資料差錯校驗等作業;有以太網、令牌環網,無線LAN標準,路由器作業在網路層,
3.傳輸層
埠號
埠號:找到應用程式,比如一臺主機QQ給另外一臺QQ發訊息,因為埠號標識一個應用程度,所以利用埠號標識目的主機QQ才收到了訊息,
埠號范圍:0-65535
埠號分類:
1.知名埠號:0-1023,比如FTP(21)、SSH(22)、Telnet(23)、HTTP(80)、HTTPS(443)
此外還有一些著名的埠號,如MySQL(3306)、Tomcat(8080)
2.動態埠號:1024-65535
問題:一個埠號可以被多個程式使用嗎?不可以一個程式可以擁有多個埠號嗎?可以 兩者的關系就像人和電話號碼的關系
TCP協議
TCP編程:需要兩個物件分別是客戶端物件和服務器端物件,服務器端ServerSocket,客戶端Socket;客戶端通過new Socket(IP, Port)就可以連接到服務器端,服務器端呼叫accept()方法就可以得到客戶端Socket物件,
TCP協議:傳輸控制協議(Transmission Control Protocal),其協議格式可以表現為:

16位源埠號:表示資料從哪個行程中來
16位目的埠號:表示資料到哪個行程中去
32位序列號、32位確認序列號:為了滿足全雙工的安全機制而存在的,
4位的首部長度:表示TCP頭部有多少個32位bit,即多少個位元組,因而TCP頭部最大長度為15*4=60
6個標志位:
- ①URG:緊急標志位,緊急指標是否有效
- ②ACK:確認號標志位,確認號是否有效
- ③PSH:推送標志位,提示接收端應用程式立刻從TCP緩沖區將資料讀走
- ④RST:請求標志位,對方要求重新建立連接,把攜帶RST標識的稱為復位報文段
- ⑤SYN:請求建立連接,把攜帶SYN標識的稱為同步報文段
- ⑥FIN:通知對方本端要關閉連接了,我們把攜帶FIN標識的稱為結束報文段
TCP十大特性:
1.確認應答ACK機制(保障TCP穩定的核心機制)

TCP將每個位元組的資料都進行了編號. 即為序列號:
因為TCP會出現后發先制的情況,也就是說后面的訊息比之前的訊息先回應,訊息之間的應答是不匹配的,
舉例:A和B之間對話,A問有沒有時間一起吃飯?要不要通個宵?B說不可能,好啊沒問題,這個程序中B對A的回應或許出現了后發先制,B的意思可能是吃飯可以,通宵不可能,如何解決這個問題呢?
B可以針對A的問題加以標識,比如通宵不可能,吃飯沒問題,但是這樣會導致一個問題,在資訊傳遞程序中占有太多的帶寬,
所以有另外的一種解決方案:A在發送訊息時攜帶同步序列號作為標志,B在回應訊息時加上ACK(ACK為1)和確認序列號給A;我們知道TCP面向資料流,不是每個訊息一個編號,而是每個字符一個編號,TCP對位元組進行編號就成為了序列號,發送的時候是一個區間序列號,回應時的確認序列號是發送的最大序列號加1,表示可以繼續發送下一段了,這樣就解決了上面的問題,
確認應答可能帶來的問題:
1.發送的資料報丟失

當發送資料丟失時,會一直對該資料進行重發,直到收到ACK為止,
2.確認應答丟失

當ACK丟失時,接識訓沖區不再寫入重復資料!這是內核實作的去重
2.超時重傳
超時重傳的原因:主機A向主機B發送資料時候因為網路堵塞丟失,資料丟失了;主機A未收到主機B的確認應答,ACK可能丟失了,出于這兩種情況,主機A都會繼續向主機B發送資料,直到獲得主機B的ACK回應,存在的問題是,以相同的時間頻率發送,必然是占用大量帶寬的,
那么超時重傳的時間如何確定呢?
- 策略1:不以固定的頻率發送,策略1采取的是悲觀的策略,如果第一次發送訊息沒有得到回應,大概率第二次也會發送失敗,因此TCP以指數級時間頻率發送訊息,
第一超時重發時間間隔為500ms,
第二次500ms2
第三次5002*2
,,, - 策略2:經歷了一定的超時重傳次數后,如果訊息還沒得到應答,TCP認為網路或對端主機出現例外,強制關閉連接,
3.連接管理
TCP連接管理包含:
- 建立連接(3次握手)
- 關閉連接(4次揮手)
三次握手:
由于TCP是全雙工通訊,在TCP通訊之前,首先要驗證發送段與接收端的收發能力,如何驗證呢?依賴的就是
三次握手機制,
舉個例子兩個人打電話:A:hi咱們聊天吧,B:好的,你能聽到嗎,A:可以聽到,開始吧,,,可以看出經過這三步就驗證了兩方的收發能力,此時就建立了TCP連接,
第一次連接:不能驗證客戶端與服務器端的收發能力
第二次連接:可以驗證客戶端的發送能力與服務器端的接收能力,但不能驗證客戶端的接收能力與服務器端的發送能力
第三次連接:可以驗證驗證客戶端的接收能力與服務器端的發送能力
至此三次握手結束,TCP建立了連接,可以正常進行資料傳輸
二次握手建立連接行嗎?
不可以!!!兩次握手不能驗證客戶端的接收能力和服務器端的發送能力,因此這是不行的哦,
四次握手可以嗎?
可以!!但是沒必要,三次握手已經驗證了二者的收發能力,
四次揮手:
當客戶端與服務器端斷開連接時,需要經歷四次握手,舉個例子:放學后,A:分手吧,B:好的,我收拾東西,B:我收拾好了,可以分手了,A:好的,分~可以看出經過這四步A和B就分開了,
三次揮手行嗎?
有可能是可以的,比如B沒有什么東西需要收拾,相當于經歷了三次揮手就完成了整個分開的操作,`當接識訓沖區沒有待結束的任務,兩次揮手就可以合并成一次,這里用了TCP的捎帶應答特性,就好比“好的,我知道,我收拾好了”,
三次握手、四次揮手示意圖:
當服務器端new ServerSocket(port)時,服務端由closed狀態變為listen狀態,客戶端new Socket(ip,port)時,客戶端由closed狀態變為syn_sent狀態,

為什么TIME_WAIT的時間是2MSL呢?
- MSL是TCP報文的最大生存時間,2MSL為ACK的最大超時時間1MSL加上對方發送給他訊息的一個最大等待時間1MSL
- 同時也是在理論上保證最后一個報文可靠到達(假設最后一個ACK丟失, 那么服務器會再重發一個FIN. 這時雖然客戶端的行程不在了,
但是TCP連接還在, 仍然可以重發LAST_ACK - 也就是說,客戶端害怕自己的訊息服務端沒有收到,也害怕服務端發送的訊息自己沒有收到,因此2MSL保證在兩個傳輸方向上的尚未被接識訓遲到的報文段都已經消失(否則服務器立刻重啟,可能會收到來自上一個行程的遲到的資料, 但是這種資料很可能是錯誤的)
一般而言,服務器上出現大量的 CLOSE_WAIT 狀態, 原因是什么呢?
在程式中沒有呼叫close()方法主動關閉連接!
4.滑動視窗
對于確認應答特性而言,沒發送一個資料段,都要給一個ACK確認應答,當收到ACK后再發送下一個資料段,這樣做的缺點就是性能比較差,

既然一發一收的性能比較低,那么我們可以一次發送多條資料,就可以提高性能,實際上將多個資料段的等待時間重疊在了一起,
- 滑動視窗大小:無需等待確認可以繼續發送資料的最大值,對于下圖而言滑動視窗大小為4000個位元組(四個段)
- 發送前四個段時不需要等待ACK,直接發送
- 收到第一個ACK后,滑動視窗向后移動,繼續發送第五個段資料
- 作業系統內核為了維護這個滑動視窗,需要開辟發送緩沖區記錄哪些資料還沒有被應答,只有確認應答過的資料才能發送緩沖區刪掉 ,

特別注意:
ACK=4001含義:告訴主機A已經成功收到了1-4000,而不是收到了3001-4000,
ACK回傳的值是主機B接識訓沖區的下一個最大連續值,這稱為“高速重發控制”或者“快重傳”,
可能存在的兩個問題:
1.訊息已經發送過去,但是ACK丟失了,
①中間的ACK丟失:無關緊要,可以通過后續的ACK進行確認,
②最后一個ACK丟失:發送端重新發送最后一個資料段,接識訓沖區發現該資料已經存在,就將該段資料拋棄,
2.訊息在發送的程序中丟失
比如1001-2000位元組的報文丟失了,發送端會一直收到1001這樣的ACK,就好像接收端在提醒發送端它想要1001,當發送端連續三次收到了1001應答,就會將1001-2000的資料重新發送;此時接收端收到1001之后,再回傳就是最大的連續值了,因為2001之后的資料已經收到了,被放在了接收端作業系統的接識訓沖區中,
5.流量控制
以結果為導向(接識訓沖區的大小)為導向進行資料的傳遞,
TCP頭部的16位視窗大小:指的是接識訓沖區的視窗大小,而不是滑動視窗的大小;滑動視窗大小是固定,沒有必要進行傳遞,接識訓沖區視窗大小是動態改變的;視窗大小通過ACK端通知發送端,- 當接識訓沖區滿了,16位視窗大小為0,發送端將不會發送訊息給接收端,但是會定期以固定頻率發送視窗探測資料包;
- 接識訓沖區視窗大小不為0時,訊息就會恢復發送,
- 16位最大表示65535,那么滑動視窗最大就是65536位元組嗎?答:不是的,TCP首部有一個視窗擴大因子,實際視窗大小是視窗欄位值左移M位,

6.擁塞控制
盡管TCP有了滑動視窗特性,能夠高效發送大量資料,但是如果一開始就發送大量的資料,仍然可能引發問題,比如網路已經很堵塞了,發送大量資料,肯定是有問題的,因此TCP引入了慢啟動機制,
慢啟動機制:先發送少量的資料,摸清當前的網路擁堵狀態,再去決定按照多大的速度傳輸資料,慢啟動只是初始時慢,增長速度還是比較快的,而我們之前說的快重傳指的是ACK回傳的始終是資料連續的最大值,
圖解擁塞控制:
- 引入一個“擁塞視窗概念”,剛開始定義擁塞視窗大小為1
- 擁塞控制視窗大小初始值為16,可以動態調整,開始發1個包,接著每次以指數形式增加包的數量,比如2、4、8、16,,,發送包數量大于擁塞視窗大小時,后面每次線性增長比如17、18,,,而不是指數增長了;當出現大量資料包丟失時,立刻將發送的包數量置為1,此外將擁塞視窗初始值設為當前丟包值的一半;然后接著重復執行上面的程序,,,,,,
- 每次發送資料包時候將擁塞視窗與接收端緩沖區視窗大小做比較,取較小的值作為實際發送的視窗,

擁塞控制, 歸根結底是TCP協議想盡可能快的把資料傳輸給對方, 但是又要避免給網路造成太大壓力的折中方案.
7.延遲應答
- 假設接收端緩沖區為1M. 一次收到了500K的資料; 如果立刻應答, 回傳的視窗就是500K;
- 但實際上可能處理端處理的速度很快, 10ms之內就把500K資料從緩沖區消費掉了;
- 在這種情況下, 接收端處理還遠沒有達到自己的極限, 即使視窗再放大一些, 也能處理過來;
- 如果接收端稍微等一會再應答, 比如等待200ms再應答, 那么這個時候回傳的視窗大小就是1M;
延遲應答策略:
- 時間限制:超過一個固定時間,延遲應答一次
- 數量限制:每隔N次發送延遲應答一次
- 需要注意的是:延遲應答時間一定要小于超時重傳時間,通常來講延遲應答是200ms;N一般取2,
8.捎帶應答
捎帶應答是針對于延遲應答的性能優化,
回顧三次揮手為什么具有可能性?
1.當接收端接識訓沖區沒有任務時,可以將ACK與FIN合并成一次,因此可以三次揮手;
2.當接識訓沖區有任務時,利用延遲應答機制,等待接識訓沖區任務結束時,利用捎帶應答機制,將將ACK與FIN合并在一起發送給發送端,實作了三次揮手,
9.面向位元組流
由于TCP面向資料流,所以資料包沒有邊界;因此不知道發送的資料從哪里開始以及從哪里結束,可能會造成
沾包和半包問題,
10.沾包/半包問題
沾包和半包都是指得到的資料不是預期的資料,
沾包/半包示意圖:

沾包解決方案1:以\n作為流的邊界來處理沾包和半包問題;
解決方案2:每次按照固定大小讀取資料包,這樣能確定每個資料邊界,就能正常收發訊息了,
TCP例外情況
行程終止:行程終止會釋放檔案描述符,電腦系統還在運行,后臺守護程式仍然可以發送FIN,和正常關閉沒有什么區別,
機器重啟:和行程終止的情況是相同的,仍然可以發送FIN,
機器掉電、網線斷開:此時接收端認為連接存在,一旦接收端有寫入操作,接收端發現連接已經不在了,就會進行reset;即使沒有寫入操作,TCP內置了一個保活定時器,會定期詢問對方是否存在,如果對方不在就把連接釋放掉,
TCP小結
保證穩定性:
- 確認應答機制
- 超時重傳機制
- 連接管理
- 流量控制
- 擁塞控制
保證性能:
- 滑動視窗
- 延遲應答
- 捎帶應答
UDP協議
基于UDP的應用層協議有那些?
動態主機配置協議(DHCP)
域名決議協議(DNS)
UDP報文格式:
UDP示意圖:

報文資訊決議:

16位UDP長度=UDP頭部長度(8個位元組)+ UDP資料長度,因而UDP一個資料報理論上最大長度位2的16次方,共65536=64kb
16位效驗和:驗證傳輸到目的主機的資料是否是正確的,在傳輸程序中是否被篡改過,
如何進行資料效驗呢?原始的資料根據MD5演算法進行計算,會得到一個值,將這個值存盤在16位的效驗和當中;接收端接收到內容之后按照通過的規則加密資料得到一個效驗和,將該效驗和與UDP頭部的16位校驗和對比,如果相等資料就是正確的,
UDP編程時,如果資料大小超過64kb怎么辦?
1.在應用層進行資料報的拆分和組合
2.大于64kb不進行處理,交給IP協議去處理,在網路層進行分包和組包(不用)原因:不穩定,在網路層分包后假如有包丟失,就會全部舍棄,
通信方式:
全雙工:發送端和接收端既能發送訊息又能接收訊息;
半雙工:發送端只能發送訊息,接收端只能接收訊息
怎么用UDP實作可靠的傳輸呢?(面試題)
可以參考TCP保證穩定的特性,比如:
引入序列號,保證資料傳輸的順序;
引入確認應答,確保對端收到了資料;
引入超時重傳,如果隔一段時間沒有應答,就重新發送資料;
,,,,,,
二者區別
1.TCP是有連接的傳輸協議,而UDP是無連接的傳輸協議;
2.TCP傳輸是穩定的,而UDP傳輸是不穩定的;
3.TCP傳輸面向資料流,而UDP傳輸面向資料報;
4.TCP既有發送緩沖區也有接識訓沖區,而UDP只有接識訓沖區,例子:快遞員把快遞放到菜鳥驛站,而不是等一個一個人去取,
TCP與UDP的使用場景是不同的,對穩定性要求比較高時使用TCP,對訊息丟失不敏感且要求性能高時,使用UDP,
4.網路層
網路層的作用就是在復雜的網路環境中確定一個合適的資料傳輸路徑,為傳輸層進行服務,
基本概念:
- 主機:配有IP地址,但是不進行路由控制的設備
- 路由器:配有IP地址又能進行路由控制,每個路由器有路由映射表
- 節點:主機和路由器的統稱
IP協議
IP協議格式:

IP協議格式引數說明
8位服務型別: 3位優先權欄位已經棄用,4位TOS欄位,和1位保留欄位(必須設定位0);4位TOS分別表示為:最小延時,最大吞吐量,最高可靠性,最小成本,這四個相互沖突,只能選擇一個,對于
ssh/telnet這樣的應用程式來說,最小延時比較重;對于ftp這樣的應用程式來說,最大吞吐量比較重要,
16位標識:表示分組ID
3位標志:保留、禁止分片、更多分片;當3位標志位中最后1位設定1時,表示這個資料包是由多個包組成的,
13位片偏移:可能出現后發先制的問題,第2個包先過來然后第1個包才過來,根據偏移量可以知道每個包的順序進行組包,
生存時間SSL:一般等于64,每經過一次路由器的跳轉此值會減1,直到這個值為0,表示這是一個無效的路由地址,直接舍棄掉,舉例:在瀏覽器中隨便輸入一個錯誤的地址,經過64次跳轉后,是無法找到對應的服務器的,
8位協議:表示上層的傳輸層協議
16位首部校驗和:檢驗當前傳輸過來的首部是否是正確的;由于傳輸層已經對資料進行了效驗,因此網路不對資料進行效驗,這樣一來提高效率,
32位源IP地址/32位目的IP地址
IP協議包最小是20位元組!!!
IP網段劃分
目前IP版本有IPV4和IPV6兩個版本
目前最流行的就是IPV4版本,采用點分四組十進制,每一組范圍是[0~255],如:255.255.255.255
IP地址分為兩個部分,網路號與主機號,
- 網路號:保證互相連接的兩個網段具有不同的標識
- 在同一網段內,主機之間具有相同的網路號,但是主機號一定不能相同!
- 不同的子網實際上就是將網路號相同的主機放到了一起
如果在子網中新增一臺主機,則這臺主機的網路號和這個子網的網路號一致,但是主機號一定不能和子網中的其他主機的主機號重復!
IP地址可以分為五類:ABCDE
A類為:點分四組中的第一組地址范圍為0~127的IP地址,已二進制來看就是“首位為0”
B類:128~191.二進制首位為10
C類:192~223.二進制首位為110
D類:224~239.二進制首位為1110
E類:240~255.二進制首位為1111
網路號:IP地址與子網掩碼按位與得到的就是網路號轉成10進制,這就是子網號
子網地址范圍(內網取值范圍):主機號從全0到全1就是子網的地址范圍
子網地址范圍計算:255 - 子網掩碼最后一組的十進制值 + 網路號開始的值
IP地址和子網掩碼還有一種簡潔的表示方法,比如:140.252.20.68/24,IP地址為140.252.20.68/24,子網掩碼的前24位是1,也就是說子網掩碼為255.255.255.0
特殊的IP地址:
1.IP地址中的主機號都為0就成為網路號,代表這個局域網
2.IP地址中的主機地址都為1就成為了廣播地址,用于給同一個鏈路中相互連接的所有主機發送資料包
私有IP和公網IP:
10.**前8位是網路號,共16,777,216個地址
172.16.到172.31.,前12位是網路號,共1,048,576個地址
192.168.*,前16位是網路號,共65,536個地址
包含在這個范圍中的, 都成為私有IP, 其余的則稱為全域IP(或公網IP);

手動管理子網內的IP是非常麻煩的,因此:
有一種技術叫做DHCP,能夠自動的給子網內新增加的主機節點分配IP地址,,避免手動管理IP不便性;
一般的路由器都帶有DHCP功能,因此路由器也可以看作一個DHCP服務器
5.資料鏈路層
以太網
以太網不是一種具體的網路,而是一種技術標準,既包含了一些資料鏈路層的內容,也包含了一些物理層的內容,例如規定了網路拓撲結構,傳輸速率等;
以太網目前是最廣泛的局域網技術,和以太網并行的還有令牌環網,無線LAN,
以太網幀格式:
源地址和目的地址是指網卡的硬體地址(也叫MAC地址), 長度是48位,是在網卡出廠時固化的;
幀協議型別欄位有三種值,分別對應IP、ARP、RARP;幀末尾是CRC校驗碼,
資料鏈路層的MTU稱為最大傳輸單元,共1500位元組,他對UDP的影響:
當UDP攜帶的資料超過1500-8(UDP頭部)-20(IP協議頭部)=1472位元組時,就會在網路層分成多個IP資料包,這就是UDP在資料鏈路層的大小限制,
MAC地址
- MAC地址用來識別資料鏈路層中相連的節點
- 長度為48位,也就是6個位元組,一般用16進制數字加上冒號形式來表示,比如:08:00:27:03:fb:19
- 在網卡出廠時就已經確定了,不能修改,MAC地址通常是唯一的(虛擬機中的MAC地址不是真實的MAC地址)
MAC地址和IP地址的區別:
IP地址描述的是整個路途的起點和終點,而MAC地址描述的是每一個區間的起點和終點,
ARP協議
ARP協議不是單純的資料鏈路層的協議,而是介于資料鏈路層與網路層之間的協議,
ARP作用:建立主機IP地址和MAC地址之間的映射關系
- 在網路通訊時,源主機的應用程式知道目的主機的IP地址和埠號,但是不知道目的主機的額硬體MAC地址;
- 資料包傳輸到對端時,先是被對端網卡接收再去處理上層協議的,如果接收到的資料包的硬體地址與本機不符合,直接拋棄;
- 因此在通訊之前必須獲得目的主機的硬體地址,
6.網路傳輸流程
封裝、分用示意圖:

7.瀏覽器中輸入一個url后會經歷什么?
1.瀏覽器會先檢查輸入的url是否正確,檢查是否符合http/https的規范;
2.瀏覽器檢查此url瀏覽器中有沒有快取資訊,如果有快取,就會去拿快取的資訊;認為一般靜態頁面是不變的,可以通過強刷ctrl+r解決或者在url中加上一個引數t表示timestamp去重新訪問;
3.進行DNS域名決議,將url決議為ip地址,根據ip地址進行訪問;
4.在傳輸層進行TCP3次握手(講一下3次握手的內容傳遞以及兩端狀態變化);
5.HTTP協議request物件發送,它包含四部分內容:請求行,請求正文,空行和Body;
6.服務器端接收到請求,并進行相應的業務處理:①得到前端傳遞過來的引數②做引數非空效驗以及相應的業務處理例如查詢資料庫;
7.服務器端把操作的結果回傳給客戶端;
8.瀏覽器拿到后端回傳的結果兵呼叫瀏覽器的內核實作前端頁面的渲染;
9.傳輸層進行TCP4次揮手(內容轉換和狀態變化),關閉TCP連接,
8.計算機網路試題
精心整理的網路習題
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289834.html
標籤:其他
上一篇:訊息佇列之Kafka系統架構———Zookeeper+Kafka集群部署
下一篇:5分鐘通過水痘事件來認識系統架構


