上一篇講了非科班前端須要掌握的、基本的計算機組成原理。 這篇開擼計算機網絡
。前端
本文主要目的也是爲了非科班前端補充計算機科班基礎知識
,好比你要作node開發,不熟悉數據如何在網絡中傳輸的話,理解不少API
會比較疑惑,那接下來,來看看這篇爲你精心準備的文章吧😁!node
這些內容其實比較枯燥,但我採起圖文並茂
的形式,而且對於不重要的知識會標註,儘可能減小閱讀的枯燥感
。啥也不說了,喝口水,開擼!webpack
具體實戰題目精品文章:juejin.cn/post/692867…web
計算機網絡:是一個將分散的、具備獨立功能的計算機系統
,經過通訊設備
與線路
鏈接起來,由功能完善的軟件
實現資源共享和信息傳遞的系統。面試
這裏須要注意的是,按分佈範圍,計算機網絡裏有局域網LAN
和廣域網WAN
, 其中局域網的表明以太網,以及這兩種網絡最重要的區分點,局域網
基於廣播技術
,廣域網
基於分組交換
技術。(這些概念聽一下就行,後面會詳細介紹,由於理解廣播和分組交換技術,大致上就理解了局域網和廣域網)算法
這些內容主要是爲了學習後面具體的協議,以及分析這些協議的報文時,須要掌握的基本概念。windows
速率就是數據傳輸(數據是指0和1)的速率,好比你用迅雷下載,1兆每秒,來衡量目前數據傳輸的快慢。它是計算機網絡中最重要的一個性能指標。瀏覽器
在計算機網絡中,網絡帶寬是指在單位時間(通常指的是1秒鐘)內能傳輸的數據量,好比說你家的電信網絡是100兆比特,意思是,一秒內最大的傳輸速率是100兆比特。緩存
吞吐量表示在單位時間內經過某個網絡(或信道、接口)的數據量。安全
以上三點,咱們舉個案例
時延是指數據(報文/分組/比特流)從網絡(或鏈路)的一端傳送到另外一端所需的時間。單位是s。 時延分一下幾種:
(1)發送時延
就是說我跟你說話,從我開始說,到說話結束這段時間,就是發送時延
。
(2)傳播時延
如gif圖所示,信道上第一個比特開始,到最後一個比特達到主機接口須要的時間就是傳播時延
。
(3)排隊時延
分組在通過網絡傳輸時,要通過不少的路由器
。
但分組在進入路由器後要先在輸入隊列中排隊等待
處理。
在路由器肯定了轉發接口後,還要在輸出隊列中排隊等待轉發,這就產生了排隊時延
。
排隊時延的長短每每卻決於網絡當時的通訊量,當網絡的通訊量很大時會發生排隊溢出,是分組丟失
。
(4)處理時延
路由器
或主機
在收到數據包時,要花費必定時間進行處理,例如分析數據包的首部
、進行首部差錯檢驗
,查找路由表
爲數據包選定準發接口,這就產生了處理時延
。
(5)往返時間(RTT)
在計算機網絡中,往返時間也是一個重要的性能指標,它表示從發送方發送數據開始,到發送方收到來自接收方的確認(接受方收到數據後便當即發送確認)總共經歷的時間
(6)時延帶寬積
是指傳播時延乘以帶寬
OSI
參考模型是網絡互連的七層
框架, 這裏不詳細介紹了,每一層的具體內容會在後面介紹,這裏只須要有一個初步的印象。
以下圖所示,1,2,3層主要是是物理鏈路
組成的,好比光纖
,路由器
,集線器
,主要負責的是數據通訊
。5,6,7層是軟件控制的
,好比http
協議,是一種軟件層面控制的協議,主要負責處理傳輸來的數據
。
對於物理層,有人會說,這不就是網線嗎,好比家裏鏈接路由器的網線,電線杆上的光纖?其實否則,物理層更多的是規定一種標準
,他並無論物理介質具體是什麼,好比電線杆上是光纖仍是雙絞線,只要你能按物理層規定的標準傳輸數據就行。
那物理層到底有哪些主要任務呢?
電氣特性
,信號的電平用+10V - +15V
表示二進制的0
,用-10V - -15V
表示二進制的1
,只要條網線能表示這個特性,就無論你用什麼材料了。知道物理層是規定傳輸媒體接口的標準
便可。網卡
傳輸出來的數據是電信號
,光纖
傳輸的是光脈衝
信號,有光脈衝表示1
,無光脈衝表示0
。10的8次方MHz
,所以光纖通訊系統的帶寬遠遠大於其它各類傳輸媒體的帶寬電信號
轉爲光信號
,而後光信號
快到服務器的時候,再把光信號
轉爲電信號
。爲何須要中繼器呢?
由於再線路上傳輸的信號功率會逐漸衰減
,衰減到必定程度時將形成信號失真
,所以會致使接收錯誤。
中繼器能夠對信號進行再生
和還原
,增長信號的傳輸距離。
須要注意的是,中繼器兩端鏈接不一樣的網段
,而不是子網。什麼叫不一樣的網段呢,須要在網絡層學習IP分類
以後纔可以理解這個概念,這裏簡單的理解爲,不一樣的網段就是不一樣路由器鏈接的網絡
。
你能看完上面這麼多概念也真是不容易,喝口水,咋們繼續!
接下來咱們進入下一層,數據鏈路層!
咱們用一個小故事來舉例
小祕書
下達任務,讓小祕把5份文件給B公司,小祕呢,就找送快遞物理層
去作這個事(1) 封裝成幀
數據鏈路層並非無腦轉發boss的信息,她要把文件編號封裝一下。封裝的網絡數據包,在鏈路層就叫數據幀
。
(2)透明傳輸
透明傳輸是指無論boss下達的任何信息,好比文件裏有裁掉這個祕書的信息,祕書都要原本來本的傳輸。幀的數據部分可能有跟幀首部徹底同樣
的字符,這時候就要採起必定的措施,讓接受方不要被被誤導,能讓接收方知道哪些是幀的首部哪些是幀的數據。這個問題有沒有相似js的轉義字符的問題,好比字符串<div>究竟是指div標籤呢,仍是div字符串呢?
(3)差錯控制
差錯控制是在文件送到B公司小祕書手裏的時候,快遞包上寫着5個文件,祕書一看只有3個文件,就會讓傻子從新發送有沒有送到的文件。差錯控制的方法有CRC循環冗餘碼
,這個就不細講了,我本身也不甚瞭解,只知道鏈路層的幀,會有一個FCS位留給這個碼,用來判斷一個幀是否出錯。
(4)差錯糾正
差錯糾正是鏈路層知道1,2,3,4,5個文件,丟失的兩個文件究竟是哪兩個,而且能經過從新發送沒有的文件來糾正。
還有一些是故事裏沒有提到的數據鏈路層的功能,好比:
(5)流量控制
好比說發送方發送速度特別快,接收方接收速度特別慢
,會形成傳輸出錯。
這裏須要注意的是,傳輸層TCP
也有流量控制
功能,區別在於TCP
是端到端
的流量控制,鏈路層是點到點
(好比一個路由器到下一個路由器)
流量控制的方法有滑動窗口協議
,以及選擇重傳協議
,這兩個留在講TCP的時候講。接下來說一下以太網,以太網是目前最多見的局域網技術。對於咱們理解局域網比較有幫助。
以太網是一種局域網
技術,其規定了訪問控制方法
、傳輸控制協議
、網絡拓撲結構
、傳輸速率
等,完成數據鏈路層和物理層的一些內容,它採用一種稱做CSMA/CD
的媒體接入方法(後面會介紹),另外的一些局域網技術,好比無線局域網
等。
目的地址
和源地址
指的是MAC地址
,即設備的物理地址。MAC地址用於標示網卡,每一個網卡都具備惟一的MAC 地址以太網幀
發出,此時局域網中全部主機都可收到這個楨,主機中的網卡接收到以太網楨後,會將目的MAC地址和本身的MAC地址進行比較,若是不相同就會丟棄,若是相同則會接收
,此時則B主機就收到了A的消息。差錯控制
,即檢驗幀的正確性
單播地址
、廣播地址
、多播地址
,其中單播地址如上面A給B主機發送,其接收者爲一個,而且其目的地址的最高字節的低位爲0
跟以太網相關的拓撲結構有星型
和總線型
。
星型拓撲以下:
總線型拓撲以下:
互聯網初期,以太網的總線型拓撲
比較廣泛。隨着總線型以太網上的站點數目增多,可靠性也會隨之降低
,而隨着大規模集成電路以及專門芯片的發展,使得星型以太網變得便宜又可靠
。
須要注意的是,以太網雖然物理上是星型拓撲
,但邏輯上是總線型
。
計算機傳出的數據,通過網卡,就會變爲以太網的幀
,還會完成一些鏈路管理
(CDMA/CD的實現),以及編碼和譯碼
(編碼譯碼我不太理解。。。好像是曼徹斯特編碼,規定如何表示高低電平)。
無線局域網WLAN是利用無線電波
、激光
和紅外線
等無線通訊技術來構建的局域網。
無線局域網咱們只介紹一下典型的網絡結構。
AP
就是通訊基站
,若是基站覆蓋的移動設備能夠直接經過基站來通訊基站和基站之間傳輸數據
,來達到兩個在不一樣基站覆蓋範圍內的無線設備通訊。由於這個協議是以太網所使用
的,因此咱們只須要記住一些特色就好了。
總線型
,半雙工網絡
(半雙工是指容許數據在兩個方向上傳輸,可是,在某一時刻,只容許數據在一個方向上傳輸)(1)網橋
網橋根據MAC幀
的目的地址進行轉發和過濾。當網橋收到一個幀時,並不會向全部接口轉發此幀,而是先檢查此幀的目的MAC地址
,而後再肯定將該幀轉發到哪個口,或者是把它丟棄。
這裏須要注意的是,網橋鏈接的是不一樣的網段,網段是什麼呢,我這裏簡單介紹一下,具體要到講IP地址
的時候細說,同一網段指的是IP地址
和子網掩碼
(講ip地址的時候會細講)相與獲得相同的網絡地址。
(2)以太網交換機
談到交換機,就不得不提兩個概念,衝突域
和廣播域
只能由一臺設備
發送信息的範圍。全部能接收到這個信號
的設備範圍稱爲廣播域跨網段
,而衝突域只是發生的同一個網段
。舉個例子,公司裏你們的電腦通常都是鏈接到交換機
上,由於交換機能夠隔離衝突域
,衝突域
的最大問題在於,同一時間只能有一臺機器傳輸數據,公司那麼多人,若是這樣的話,傳輸數據速度太慢了。而後交換機再鏈接到路由器
上,首先路由器
能隔離廣播域,其次不通過路由器,你的數據鏈路層上的包
沒辦法進入到互聯網裏面去`,路由器是網絡層的設備。
兄弟,能看完上面內容,你也真夠能忍的,牛B,喝口水!繼續!
概念走一走,看一看,瞄一眼就行啦!
網絡層主要任務是將分組
(分組的概念是大多數計算機網絡都不能連續地傳送任意長的數據,因此實際上網絡系統把數據分割成小塊,而後逐塊地發動,這種小塊就稱做分組)從一臺主機移動到另外一臺主機,從而提供了主機到主機的通訊服務和各類形式的進程到進程的通訊
。
當主機H1
要向另外一主機H2
發送數據(報文)時,首先將數據劃分紅若干個等長的分組
,而後將這些分組一個接一個地發往裏與H1相聯的路由A
,當A
接到分組後,先放入緩衝區,再按必定的路由算法肯定該分組下一步將發注哪一個結點,如此一個結點一個結點傳遞,直到最終目的H2
。
這一段話比較囉嗦,簡單來講分組就是分數據塊
,同時還具備無需創建鏈接
,存儲轉發
(存儲轉發是指以太網交換機的控制器先將輸入端口到來的數據包緩存起來,先檢查數據包是否正確,並過濾掉衝突包錯誤),動態分配路線
(交換設備會根據網絡情況選擇不一樣的路線,好比路由器)的優勢。
數據報是經過網絡傳輸的數據的基本單元
,包含一個報頭(header)
和數據
自己。說白了,就是帶地址的數據,好比你的寫了一句微信"你好",這串文字本上加上源地址,目的地址,就是數據報。
20字節
,共20 * 8 = 160比特(1字節=8比特)0 - 4
比特是版本號
,版本有ipv4/ipv6單位是4B
,最小爲5, 爲何是5呢?由於首部至少20字節,因此4* 5就是20字節首部+數據
TTL
,它告訴網絡,數據包在網絡中的時間是否太長而應被丟棄。每通過一個路由器減一,變成0就丟棄TCP
協議用6
表示,UDP
協議用17
表示便可。首部校驗和佔16位
。這個字段只檢驗數據報的首部,但不包括數據部分。IP地址
,目的地址是經過DNS
查詢得來的。爲何要分片呢?
鏈路層數據幀封裝的數據大小是有限制
的,以太網的MTU
(MTU是指一種通訊協議的某一層上面所能經過的最大數據包大小)是1500字節
。
接下來咱們就看看在ip數據包上,哪些字段標識了分片的數據呢?
同一數據的分片
時相同。MF
,MF=1
即表示後面「還有分片」的數據報。MF=0
表示這已經是若干數據報片中的最後一個。DF
(Don’t Fragment),意思是「不能分片」。只有當DF=0
時才容許分片。ip地址有5種
1.0.0.0~126.255.255.255
128.0.0.0~191.255.255.255
192.0.0.0~223.255.255.255
224.0.0.0~239.255.255.255
240.0.0.0~254.255.255.255
127.0.0.0~127.255.255.255
用於環回測試,D類地址用於組播,E類地址用於科研這裏須要注意的是,你發沒發現,爲何咱們前端啓動webpack測試環境的時候,通常地址都是192.168.*.*(* 是指0-255的數字); 在公司和家裏都是這個網段,不是很奇怪嗎,你家裏的網段怎麼和公司同樣呢?
實際上是由於有一部分叫私有IP地址
,是不能拿到網絡上跟別的計算機通訊的。只能是局域網
本身內部用。好比說有:
能夠看到,C類私有地址就是192.168網段,每一個局域網均可以有這些私有IP。
還有一些特殊地址
,須要瞭解
注意,這裏的全1是指,ipv4地址由4個字節組成
,每個字節是8位,8位全一就是十進制的255
, 即255.255.255.255
。
255.255.255.255
,在本網絡的目的地址寫這個的話,就會內網廣播
192.169.10.1
,這是c類網絡,因此網絡號是192.169.10
,主機號是1
,當主機號全0時,就是0,表示192.169.10.0
這個網段192.169.10.1
這個c類地址,主機號都是1,也就是8個1,表明255,因此192.169.10.255
表示本網段的廣播地址127
做爲網絡號,主機號非全0或1,好比說127.0.0.1
表明本機,稱爲環回地
址。在ip地址分類裏面,咱們知道私有ip地址
是不能跟外網交互的,在小公司大多數計算機的地址都是192.168
網段,都是私有ip地址,它是怎麼跟外網交互數據的呢,這裏就引出來一個知識點叫網絡地址轉換NAT
。
如上圖所示,192.168.0.3
,192.168.0.4
都是私有網段上的,它們沒法跟外網通訊,這個時候因爲路由器安裝了NAT軟件,就能夠將本身的ip地址,即路由器的ip地址172.38.1.5
做爲內網的代理,去訪問外網,外網返回來的數據,通過路由轉換,轉換成內網的192.168
網段的私有地址。
首先要明白,爲何要劃分子網?
首先你們要知道:
整體來講,劃分子網不但沒有增長可用IP地址,並且減小了可用IP地址,由於每一個子網中的全0網絡地址和全1廣播地址均不能做爲主機ip來使用。
爲何劃分子網:
接下來,咱們看看子網劃分
如上圖右側,咱們將145.13.0.0
這個網段劃分了三個子網,其中一個是145.13.3.0
,一個是145.13.21.0
,問題來了,若是一個網絡包來了,網絡包要交給的ip地址是145.13.3.10
,咱們怎麼知道給哪一個子網呢?
方法是將目的包的ip地址,跟子網的子網掩碼
相與預算(二進制與預算規則是,1跟1得1,其它爲0),也就是目的地址145.13.3.10
跟子網145.13.3.0
的子網掩碼255.255.255.0
的與預算,獲得的結果是145.13.3.0
,因此發送到的子網就是145.13.3.0
。
這裏有人會問什麼是子網掩碼,子網掩碼的格式跟IP是同樣的,0,0,0,0 到 255.255.255.255,主要是幫助咱們劃分子網的,瞭解到這裏對咱們前端就夠了。
爲何須要ARP協議呢?
咱們簡單回顧一下以太網的幀的格式
上圖有一個源地址
和目的地址
,這兩個地址都是指的mac地址
,mac地址
是什麼呢?簡單說來就是兩臺相鄰的路由器A和B,A怎麼把數據傳給B呢,它總要知道B的物理地址吧,物理地址就像門牌號
同樣,我要知道你住在哪裏,才能把數據送過去吧?
首先你確定知道本身的mac地址是多少,由於在網卡上有,問題在於,別人的mac地
址是多少?ARP協議
就是來幫你找mac地址
的。
接着咱們說一下
ARP協議
的過程(比較官方的介紹,看不懂能夠略過):
每臺主機都會在本身的ARP緩衝區中創建一個 ARP列表
,以表示IP地址
和MAC地址
的映射關係
當源主機須要將一個數據包要發送到目的主機時,會首先檢查本身 ARP列表
中是否存在該 IP地址
對應的MAC地址
若是有,就直接將數據包發送到這個MAC地址
;若是沒有,就向本地網段發起一個ARP請求
的廣播包,查詢此目的主機對應的MAC地址
此ARP請求
數據包裏包括源主機的IP地址
、硬件地址
、以及目的主機的IP地址
。網絡中全部的主機收到這個ARP請求
後,會檢查數據包中的目的IP是否和本身的IP地址一致
若是不相同就忽略此數據包;若是相同,該主機首先將發送端的MAC地址
和IP地址
添加到本身的ARP列表
中
若是ARP表
中已經存在該IP的信息,則將其覆蓋,而後給源主機發送一個 ARP響應
數據包,告訴對方本身是它須要查找的MAC地址
源主機收到這個ARP響應
數據包後,將獲得的目的主機的IP地址
和MAC地址
添加到本身的ARP列表
中,並利用此信息開始數據的傳輸
若是源主機一直沒有收到ARP響應
數據包,表示ARP查詢失敗
DHCP(動態主機配置協議)是一個局域網的網絡協議。指的是由服務器控制一段lP地址範圍,客戶機登陸服務器時就能夠自動得到服務器分配的lP地址和子網掩碼。說白了,當你接入局域網的時候,自動由這個dhcp服務器給你分配ip,windows用戶可能知道網卡配置裏面,由自動獲取ip的功能,若是路由器提供DHCP服務,你就會自動獲取隨機分配的ip。
路由器裏能夠開啓這個服務。
大體工做過程(瞭解便可)
ICMP協議是一個網絡層協議。 爲何咱們須要ICMP協議呢?
一個新搭建好的網絡,每每須要先進行一個簡單的測試,來驗證網絡是否暢通;可是IP協議並不提供可靠傳輸
。若是丟包了,IP協議並不能通知傳輸層是否丟包以及丟包的緣由。
因此咱們就須要一種協議來完成這樣的功能–ICMP協議。
ICMP協議的功能主要有:
咱們舉一個例子:
主機H2收到主機H1的一個UDP包
,結果H2發現這個包裏的端口沒有被監聽,這時候就回復給H2一個ICMP應答報文
,意思是這個UDP數據包
,沒法交給應用進程,只能丟棄了。
如下是4種常見的ICMP差錯報告報文
咱們經常使用的ping
命令藉助ICMP協議
,探測主機是否能找到目的主機。
路由器是一種具備多個輸入端口和多個輸出端口的專用計算機,其任務是轉發和分組。
以下圖所示,分別由轉發和分組功能的說明。
接着,咱們看一下路由器輸入端口作了哪些事情
首先,物理層是傻瓜層
,傳輸比特流
,咱們把物理層的比特流還原成數據鏈路層的數據幀,而後把數據鏈路層的數據報脫去,成爲網絡層數據包,交給路由器。這時候就要判斷一下這個數據包是什麼類型的了。
若是它是路由器之間,交換路由信息的分組,就會把這個數據包交付給如上上圖所示的,路由選擇處理機,進行處理和計算。若是是數據分組,就會放到一個隊列裏面
,排隊等候,而後選擇一個合適的輸出端口輸出。
最後咱們看一下路由器輸出端口作了哪些事情
從上圖能夠看到,輸出端口是作的輸入端口的逆過程,將網絡層的數據包轉換爲鏈路層的數據幀,最後轉爲物理層的比特流。
輸入和輸出端口須要注意的是,它們都有一個緩衝隊列,好比輸入數據的速度太快,輸出數據速度慢,爲了平衡輸入輸出速度,就用緩衝隊列把數據緩衝下來,一個一個慢慢的處理,但緩衝隊列也有限度,超出這個限度,緩衝隊列容納不下,包就會被丟到。
立刻就要到對前端最重要的傳輸層和應用層知識了!準備接招!
傳輸層是隻有計算機纔有的層次,主要提供是進程間邏輯通訊
+ 可靠傳輸
或者不可靠
的功能。好比你的QQ跟你異地女朋友的QQ視頻聊天,這就是不一樣計算機之間,進程間的通訊。
這裏簡單說一下可靠傳輸協議TCP
+ 不可靠傳輸協議UDP
。
TCP面向鏈接,可靠,不提供廣播和多播,並且時間延遲比較大,適用於大文件傳輸。 UDP無鏈接,收到的報也不確認,但時間延遲小,適用於小文件。
端口號能夠用來標識同一個主機上通訊的不一樣應用程序(就是哪一個應用程序在使用這個端口)。
那爲何一個端口只能分配給一個應用程序,不能是多個呢?
若是服務器有兩個應用程序A,B
,分別啓動了A服務和B服務,它們監聽同一個端口,那有數據來的時候,服務器沒法判斷這個數據究竟是給A,仍是給B。
UDP協議是參考模型中一種無鏈接
的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
(1) UDP協議的特色
UDP是無鏈接的
,減小開銷和發送數據以前的時間延遲。你們都知道TCP
的三次握手和四次分手
,這個是須要時間花銷的,可是UDP沒有這部分花銷。
UDP使用最大努力交付
,即不保證可靠交付。那誰來保證可靠的交付呢?是由UDP的上一層協議,應用層來保證。
UDP是面向報文的
,適合一次性傳輸少許數據的網絡應用。什麼意思呢,以下圖,UDP這層,把應用層的所有內容做爲本身的數據報部分,在IP層也只是加了一個IP首部,咱們知道,在以太網,鏈路層上的數據若是超過1500字節,就會分片,因此網絡層發現上面傳輸層給了太大的數據就會分片
,加上UDP是不可靠的協議,這就加大了UDP的不可靠性
,容易丟失,因此UDP適合數據量少的。
減小網絡傳輸開銷
的一方面。(2)UDP首部
0 - 65535
。源端口號能夠沒有,由於不但願收到對方的迴應,能夠寫全0,目的端口是必定要有的。首部+數據的長度
,好比數據2B,首部固定是8B,那麼UDP長度就是2+8 = 10B首部和數據有錯誤
,若是有錯就丟棄掉。好比說目的主機找不到對應的端口號,就會給發送方返回一個ICMP,‘端口不可達’
的差錯報文。TCP協議簡單來講是一種位於傳輸層的,面向鏈接的、可靠的、基於字節流的傳輸層通訊協議
TCP協議的特色:
面向鏈接
的傳輸層協議。好比說TCP的三次握手,四次分手,針對的都是鏈接。只能有兩個端點
,每一條TCP鏈接是點對點的。也就是說TCP是不一樣計算機之間的進程的通訊
。可靠有序,不丟不重
。全雙工通訊
。全雙工指的是鏈接雙方能夠同時收發數據。在收發兩端都有發送緩存和接收緩存,發送緩存就是一個準備發送的隊列,接收緩存是一個準備接收的隊列。面向字節流
。以下圖,咱們解釋一下什麼是面向字節流:圖中的1,2,3,4.....數據塊,每個表示一個字節。tcp將應用層的數據變爲了這樣的字節進行發送,好比玩過node同窗,知道一個buffer,buffer就是字節流。
TCP報文的首部格式
以下圖所示,咱們看一下比較重要的一些首部字段,這裏咱們介紹固定的20字節
的TCP首部
接收方收到了1,2,3個字節組成的數據包,而後接收方就會發送一個確認報文給發送方,其中確認報文的確認號就應該是4,由於1,2,3這三個字節的組成的數據包已經收到了。
控制位 | 做用 |
---|---|
ACK | 置1時表示確認號合法,爲0的時候表示數據段不包含確認信息,確認號被忽略 |
PSH | 置1時請求的數據段在接收方獲得後就可直接送到應用程序,而沒必要等到緩衝區滿時才傳送 |
RST | 置1時重建鏈接。若是接收到RST位時候,一般發生了某些錯 |
SYN | 置1時用來發起一個鏈接 |
FIN | 置1時表示發端完成發送任務。用來釋放鏈接,代表發送方已經沒有數據發送了 |
URG | 緊急指針,告訴接收TCP模塊緊要指針域指着緊要數據 |
以下圖所示,分別來了解一下創建鏈接的過程:
SYN置爲1
,seq
指的是序號,是隨機產生的。分配緩存和變量
,緩存指的是一個字節流隊列。(發送方和接收方都有這個隊列,並且若是雙方須要互相通訊,那麼雙方都會有發送緩存和接收緩存),接着會返回一個確認報文,其中SYN控制位置爲1
,意思是容許創建鏈接,ACK是確認號
,確認收到了發送方的包,而且會設一個seq序號
,也爲一個隨機數。小寫ack
是確認號,也就是接下來但願發送方要發的數據從哪開始。SYN控制位變爲0
,意思這不是創建鏈接的請求了,要正式發數據了,ACK是確認碼
,意思是收到了服務器的確認請求了。以下圖所示,分別來了解一下釋放鏈接的過程:
FIN=1,seq=u
。u是以前傳送過來的最後一個字節的序號+1
。FIN:用來釋放一個連接,當FIN=1的時候,代表此報文的發送方已經完成了數據的發送,沒有新的數據要傳送,並要求釋放連接。
客戶端等着服務器返回確認
服務器收到客戶端的請求斷開連接的報文以後,返回確認信息。ACK=1,seq=v,ack=u+1
。這個時候,客戶端不能給服務器發送信息報文,只能接收。可是服務器要是還有信息要傳給服務器,仍然能傳送。這裏的v
是什麼意思呢,這就取決於服務器發送給客戶端以前的一個包確認號是多少了。
當服務器也沒有了能夠傳的信息以後,給客戶端發送請求結束的報文。FIN=1,ACK=1,ack=u+1,seq=w
。這裏的w
,跟上面的v
是一個意思,爲何不都是v
呢,由於這一步和上一步中間可能還在發數據呢,因此seq
這個數據發送的字節流序號可能要變。
客戶端接收到FIN=1
的報文以後,返回確認報文,ACK=1,seq=u+1,ack=w+1
。發送完畢以後,客戶端進入等待狀態,等待兩個時間週期。關閉。
爲何最後還要等待兩個時間週期呢?
ACK
報文在傳輸的時候丟失,服務器並無接收到這個報文。這個候時候服務器就會超時重傳這個FIN
消息,而後客戶端就會從新返回最後一個ACK報文
,等待兩個時間週期,完成關閉。爲何鏈接的時候是三次握手,關閉的時候倒是四次握手?
FIN
報文時,僅僅表示對方再也不發送數據了可是還能接收數據,而本身也未必所有數據都發送給對方了,因此己方能夠當即關閉,也能夠發送一些數據給對方後,再發送FIN
報文給對方來表示贊成如今關閉鏈接ACK和FIN
通常都會分開發送,從而致使多了一次。爲何不能用兩次握手進行鏈接?
如下是網上廣泛的解答:
若創建鏈接只需兩次握手,客戶端並無太大的變化,仍然須要得到服務端的應答後才進入ESTABLISHED
狀態,而服務端在收到鏈接請求後就進入ESTABLISHED
狀態。
此時若是網絡擁塞,客戶端發送的鏈接請求遲遲到不了服務端,客戶端便超時重發請求,若是服務端正確接收並確認應答,雙方便開始通訊,通訊結束後釋放鏈接。此時,若是那個失效的鏈接請求抵達了服務端,因爲只有兩次握手,服務端收到請求就會進入ESTABLISHED
狀態,等待發送數據或主動發送數據
但此時的客戶端早已進入CLOSED
狀態,服務端將會一直等待下去,這樣浪費服務端鏈接資源
但我以爲這個只是兩次握手可能形成的問題,最關鍵的是兩次握手有服務器對客戶端的起始序列號作了確認,但客戶端卻沒有對服務器的起始序列號作確認
,不能保證傳輸的可靠性。
若是已經創建了鏈接,可是客戶端忽然出現故障了怎麼辦?
TCP保活計時器 每次客戶端請求服務器會重置計時器,當2小時以內
沒收到客戶端任何數據時,會每隔75s
向客戶端發一個探測報文,若接連發送10個
,客戶端都沒有反應,則認爲客戶端故障,關閉鏈接。
什麼是SYN洪泛攻擊?
TCP的 SYN
,SYN是TCP三次握手中第一個數據包,而當服務器返回ACK後,該攻擊者就不對其進行再確認,那這個TCP鏈接就處於掛起狀態,也就是半鏈接狀態,服務器收不到再確認的話,還會重複發送ACK給攻擊者。序號(ISN)爲何要隨機?
增長安全性,爲了不被第三方猜想到,從而被第三方僞造的RST報文Reset。
三次握手的第一次能夠攜帶數據嗎?爲什麼?
SYN FLOOD
(SYN洪泛)攻擊。三次握手的第三次能夠攜帶數據嗎?爲什麼?
第三次握手,此時客戶端已經處於ESTABLISHED
狀態。對於客戶端來講,他已經創建起鏈接了,而且已經知道服務器的接收和發送能力是正常的。因此也就能夠攜帶數據了。
主要經過如下四種方式實現可靠傳輸機制:
爲何須要流量控制呢?
好比發送方發送速度很是快,接收方接收速度特別慢,這樣就會發生嚴重的丟包現象。
TCP經過滑動窗口的機制來實現流量控制。簡單來講以下(建議網上找一個動畫教程來理解,文字效果不是很好):
滑動窗口的大小意味着接收方還有多大的緩衝區能夠用於接收數據
。發送方能夠經過滑動窗口的大小來肯定應該發送多少字節的數據。0
時,發送方通常不能再發送數據報
,但有兩種狀況除外,一種狀況是能夠發送緊急數據,例如,容許用戶終止在遠端機上的運行進程。另外一種狀況是發送方能夠發送一個 1 字節的數據報來通知接收方從新聲明它但願接收的下一字節及發送方的滑動窗口大小。這部分我也以爲文字部分太生硬了,開始我也不怎麼理解,看來一個視頻以後我瞭解了基本原理,這裏我文字版和視頻地址都放上來。
視頻地址以下:擁塞控制視頻版
文字版以下:
若是網絡出現擁塞,分組將會丟失,此時發送方會繼續重傳,從而致使網絡擁塞程度更高。所以當出現擁塞時,應當控制發送方的速率。這一點和流量控制很像,可是出發點不一樣。流量控制是爲了讓接收方能來得及接收,而擁塞控制是爲了下降整個網絡的擁塞程度。
TCP 主要經過四個算法來進行擁塞控制:慢開始、擁塞避免、快重傳、快恢復。
發送方須要維護一個叫作擁塞窗口(cwnd)的狀態變量,注意擁塞窗口與發送方窗口的區別:擁塞窗口只是一個狀態變量,實際決定發送方能發送多少數據的是發送方窗口。
爲了便於討論,作以下假設:
接收方有足夠大的接收緩存,所以不會發生流量控制;
雖然 TCP 的窗口基於字節,可是這裏設窗口的大小單位爲報文段。
慢開始與擁塞避免
發送的最初執行慢開始,令 cwnd = 1,發送方只能發送 1 個報文段;當收到確認後,將 cwnd 加倍,所以以後發送方可以發送的報文段數量爲:二、四、8 ...
注意到慢開始每一個輪次都將 cwnd 加倍,這樣會讓 cwnd 增加速度很是快,從而使得發送方發送的速度增加速度過快,網絡擁塞的可能性也就更高。設置一個慢開始門限 ssthresh,當 cwnd >= ssthresh 時,進入擁塞避免,每一個輪次只將 cwnd 加 1。
若是出現了超時,則令 ssthresh = cwnd / 2,而後從新執行慢開始。
快重傳與快恢復
在接收方,要求每次接收到報文段都應該對最後一個已收到的有序報文段進行確認。例如已經接收到 M1 和 M2,此時收到 M4,應當發送對 M2 的確認。
在發送方,若是收到三個重複確認,那麼能夠知道下一個報文段丟失,此時執行快重傳,當即重傳下一個報文段。例如收到三個 M2,則 M3 丟失,當即重傳 M3。
在這種狀況下,只是丟失個別報文段,而不是網絡擁塞。所以執行快恢復,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此時直接進入擁塞避免。
慢開始和快恢復的快慢指的是 cwnd 的設定值,而不是 cwnd 的增加速率。慢開始 cwnd 設定爲 1,而快恢復 cwnd 設定爲 ssthresh。
應用層對應用程序的通訊提供服務。
一些比較重要的應用層協議以下圖:
第一種是客戶端/服務器模型,也就是C/S架構。好比電子郵件、web都是。
第二種是P2P模型,每一個主機既能夠提供服務,也能夠請求服務。好比迅雷下載也是使用P2P技術的。
而TCP鏈接有兩種工做方式:短鏈接方式(Short-Live Connection)和長鏈接方式(Long-Live Connection)。
當客戶端有請求時,會創建一個TCP鏈接,接收到服務器響應後,就斷開鏈接。下次有請求時,再創建鏈接,收到響應後,再斷開。如此循環。這種方式主要有兩個缺點:
創建TCP鏈接須要3次「握手」,拆除TCP鏈接須要4次「揮手」,這就須要7個數據包。若是請求和響應各佔1個數據包,那麼一次短鏈接的交互過程,有效的傳輸僅佔2/9,這個利用率過低了。
主動斷開TCP鏈接的一端,TCP狀態機會進入TIME_WAIT狀態。若是頻繁地使用短鏈接方式,就有可能使客戶端的機器產生大量的處於TIME_WAIT狀態TCP鏈接。
什麼是DNS說白了就是將域名轉化爲ip,好比www.qq.com,這是域名,能夠是網絡包須要對方ip地址,域名是不能加入網絡包報頭的,因此就須要去找一個服務器問,qq的域名對應的ip是多少。
大概的通訊過程以下:
DNS
的客戶端,就是咱們的PC機或者手機客戶端運行着DNS客戶端了http://www.baidu.com/
, 並將這個主機名傳送給DNS應用的客戶端查詢報文
,報文中包含着要訪問的主機名字段
(中間包括一些列緩存查詢以及分佈式DNS集羣的工做)回答報文
,其中包含有該主機名對應的IP地址
這裏須要補充一個小知識,關於域名的,大概瞭解一下就行
萬維網www是一個大規模的、聯機式的信息存儲所,是無數個網絡站點和網頁的集合。
知識盲區: 在很多人看來,互聯網、因特網、萬維網沒有大多的區別,其實這三者之間的關係應該是:互聯網包含因特網,因特網包含萬維網。
互聯網internet
。凡是由能彼此通訊的設備組成的網絡就叫互聯網,即便僅有兩臺機器(計算機、手機等),不論用何種技術使其彼此通訊,都叫互聯網,因此,互聯網有廣域網、城域網及局域網之分,國際標準的互聯網寫法是internet,字母i必定要小寫!
因特網Internet
。而因特網是互聯網中的一種,它可不是僅有兩臺機器組成的網絡,而是由上千萬臺設備組成的網絡(該網絡具有很大的規模)。因特網使用TCP/IP協議
讓不一樣的設備能夠彼此通訊。但使用TCP/IP協議
的網絡並不必定是因特網,一個局域網也能夠使用TCP/IP協議
。
因特網是基於TCP/IP協議
實現的,TCP/IP協議
由不少協議組成,不一樣類型的協議又被放在不一樣的層,其中,位於應用層的協議就有不少,好比FTP、SMTP、HTTP
。因此,因特網提供的服務通常包括有:www(萬維網)服務、電子郵件服務(outlook)、遠程登陸(QQ)服務、文件傳輸(FTP)服務、網絡電話
等等。
萬維網
。只要應用層使用的是HTTP協議,就稱爲萬維網(World Wide Web)
。之因此在瀏覽器裏輸入百度網址時,能看見百度網提供的網頁,就是由於您的我的瀏覽器和百度網的服務器之間使用的是HTTP協議在交流。
萬維網使用統一資源定位符做爲標識符來訪問資源。
URL的格式以下:
超文本傳輸協議(http)
傳送給使用者。萬維網服務器請求萬維網文檔
,以及服務器怎樣把文檔傳送給瀏覽器
。http報文頭分析:
下面是對各部分的簡要描述:
方法(method):客戶端但願服務器對資源執行的動做,是一個單獨的詞,好比,GET、POST或HEAD
請求URL(request-URL):要直接與服務器進行對話,只要請求URL是資源的絕對路徑
就能夠了,服務器能夠假定本身是URL的主機/端口
版本(version):報文所使用的HTTP版本
。其格式:HTTP/<主要版本號>.<次要版本號>
狀態碼(status-code):狀態碼是三位數字,描述了請求過程當中所發生的狀況
。每一個狀態碼的第一位數字都用於描述狀態的通常類別(好比,「成功」、「出錯」等等)
緣由短語(reason-phrase):數字狀態碼的可讀版本,包含行終止序列以前的全部文本。緣由短語只對人類有意義,所以,儘管響應行HTTP/1.0 200 NOT OK
和HTTP/1.0 200 OK
中緣由短語的含義不一樣,但一樣都會被看成成功指示處理
頭部(header):能夠有零個或多個頭部,每一個首部都包含一個名字,後面跟着一個冒號(:),而後是一個可選的空格,接着是一個值,最後是一個CRLF首部是由一個空行(CRLF)結束的,表示了頭部列表的結束和實體主體部分的開始
實體的主體部分(entity-body):實體的主體部分包含一個由任意數據組成的數據塊,並非全部的報文都包含實體的主體部分,有時,報文只是以一個CRLF結束。
下面是經常使用頭部:
通用頭部:既能夠出如今請求報文中,也能夠出如今響應報文中,它提供了與報文相關的最基本的信息
Connection:容許客戶端和服務器指定與請求/響應鏈接有關的選項,http1.1默認是keep-alive
Date:提供日期和時間標誌,說明報文是什麼時間建立的
Transfer-Encoding:告知接收端爲了保證報文的可靠傳輸,對報文采用了什麼編碼方式
Cache-Control:用於隨報文傳送緩存指示
請求頭部:請求頭部是隻在請求報文中有意義的頭部。用於說明是誰或什麼在發送請求、請求源自何處,或者客戶端的喜愛及能力
Host:給出了接收請求的服務器的主機名和端口號
Referer:提供了包含當前請求URI的文檔的URL
User-Agent:將發起請求的應用程序名稱告知服務器
Accept:告訴服務器可以發送哪些媒體類型
Accept-Encoding:告訴服務器可以發送哪些編碼方式
Accept-Language:告訴服務器可以發送哪些語言
Range:若是服務器支持範圍請求,就請求資源的指定範圍
If-Range:容許對文檔的某個範圍進行條件請求
Authorization:包含了客戶端提供給服務器,以便對其自身進行認證的數據
Cookie:客戶端用它向服務器傳送數據
響應頭部:響應頭部爲客戶端提供了一些額外信息,好比誰在發送響應、響應者的功能,甚至與響應相關的一些特殊指令
Age:(從最初建立開始)響應持續時間
Server:服務器應用程序軟件的名稱和版本
Accept-Ranges:對此資源來講,服務器可接受的範圍類型
Set-Cookie:在客戶端設置數據,以便服務器對客戶端進行標識
實體首部:描述主體的長度和內容,或者資源自身
Allow:列出了能夠對此實體執行的請求方法
Location:告知客戶端實體實際上位於何處,用於將接收端定向到資源的位置(URL)上去
Content-Base:解析主體中的相對URL時使用的基礎URL
Content-Encoding:對主體執行的任意編碼方式
Content-Language:理解主體時最適宜使用的天然語言
Content-Length:主體的長度
Content-Type:這個主體的對象類型
ETag:與此實體相關的實體標記
Last-Modified:這個實體最後一次被修改的日期和時間
實體的主體部分:該部分其實就是HTTP要傳輸的內容,是可選的。HTTP報文能夠承載不少類型的數字數據,好比,圖片、視頻、HTML文檔電子郵件、軟件應用程序等等。
經常使用的HTTP方法和狀態碼就不詳細介紹了,本文完結!你這都能耐心看完,我以爲你太厲害了!