如果你感覺已經(jīng)被上述情景安排,那么有必要好好看看這篇文章,。 另外附上一篇tcp/ip面試中的問題視頻解答:面試中tcpip,,哪些容易被問到的及解答 1 、什么是協(xié)議協(xié)議實際上就是一種約定,。好比說,,我們做一個石頭剪刀布的游戲,我們約定好:石頭>剪刀,、剪刀>布,、布>石頭,以此作為游戲規(guī)則。我們所有人都遵循這個約定,,那么就不需要任何的多余的溝通便可以完成這個游戲,。而這種方式形成的約定實際上就是一種協(xié)議了。 2,、TCP/IP協(xié)議簇話聯(lián)網(wǎng)早期是,,盡管知道計算機連接的原理,但是沒有協(xié)議的時候,,就沒有辦法進行大規(guī)模的通信使用,。當(dāng)時就衍生出了很多為了解決當(dāng)時問題的協(xié)議,像TCP協(xié)議就是為了約定大家使用TCP連接時傳輸?shù)囊环N協(xié)議,,HTTP協(xié)議則是為了約定文本傳輸?shù)囊环N協(xié)議,。 而TCP/IP協(xié)議并不是指某一個具體的協(xié)議,它是指代一系列的協(xié)議棧,,因此也叫TCP/IP協(xié)議?;蛘逿CP/IP協(xié)議簇。
在 TCP/IP協(xié)議簇 中,,定義了包含對應(yīng) OSI 模型的每一層。但同時對 OSI 模型層做了簡化處理,??纯催@種圖理解一下: TCP/IP層和OSI參考模型層的對應(yīng)關(guān)系 也即是OSI模型中的7層,,在TCP/IP中使用4層代替了,。沒辦法,誰讓OSI那么復(fù)雜呢,。 在TCP/IP協(xié)議簇中每一層都有對應(yīng)的協(xié)議,,最終組成協(xié)議簇。 TCP/IP協(xié)議棧每一層的協(xié)議 我們經(jīng)常說的TCP和UDP在協(xié)議棧的傳輸層,,而IP協(xié)議則在協(xié)議棧的網(wǎng)絡(luò)互聯(lián)層。還有經(jīng)常被問到的HTTP協(xié)議實際上在協(xié)議棧的應(yīng)用層,。 TCP/IP協(xié)議棧被分作這么多的層級,目的是為了整理硬件間通信時的一個通用的模型,,因此它們每一層都和其上下層有關(guān)聯(lián)性的,,如下圖: TCP/IP協(xié)議棧數(shù)據(jù)封包分層 上面就是'TCP/IP協(xié)議'的總體概念了,。但是其內(nèi)部還有這么多的協(xié)議,,這里挑幾個常見的講一講,從底層到上層:
2. 1 IP協(xié)議IP協(xié)議處于TCP/IP協(xié)議簇的網(wǎng)絡(luò)互聯(lián)層,。它提供不可靠,、無連接的服務(wù),也即依賴其他層的協(xié)議進行差錯控制,。在局域網(wǎng)環(huán)境,,IP協(xié)議往往被封裝在以太網(wǎng)幀中傳送。而所有的TCP,、UDP,、ICMP、IGMP數(shù)據(jù)都被封裝在IP數(shù)據(jù)包包中傳送,。 在IP協(xié)議中,,有兩個重要的內(nèi)容需要了解下。一是IP地址的概念,,二是IP協(xié)議的報頭,。 2.1.1 IP地址的概念其實對于IP地址我們?nèi)粘=佑|還是挺多的。它給每一個接入互聯(lián)網(wǎng)的計算器一個地址,,從而使得其他的計算機能夠訪問到它,。與此同時,當(dāng)計算機有了地址之后,,才能遵循IP協(xié)議,,和其他的計算機進行數(shù)據(jù)的傳遞。 目前有兩種IP版本,,分別是IPV4和IPV6,。IPV4占用8個字節(jié)32bit,而IPV6則是32個字節(jié)128bit,。IPV6的可用的數(shù)量極其龐大,,大到全球每一粒沙子都可以分配一個IPV6地址,。 以IPV4為例, IPV4的32bit地址中,分為兩個部分:網(wǎng)絡(luò)號和主機號。同時根據(jù)不同的內(nèi)容開頭,,又分為A,、B、C,、D,、E類。 IPV4 網(wǎng)絡(luò)號用于區(qū)分不同的網(wǎng)絡(luò)點,,比如一個公司是一個網(wǎng)絡(luò)集群,我們可以通過他的網(wǎng)絡(luò)號確定該公司網(wǎng)關(guān),,再通過主機號確定每一臺計算,。 假如一個C類的IP地址類型,包含了21位網(wǎng)絡(luò)號,,實際上就能區(qū)分出 2^21 個網(wǎng)絡(luò)號,,而在每一個網(wǎng)絡(luò)號中,可以區(qū)分 2^8 -2 = 254(起始的網(wǎng)絡(luò)號地址和最后一個為廣播地址都不可用于主機)個主機號,。如果一個網(wǎng)吧采用這種方式的話,,那么他最多能安裝254臺機器。如果我們想要得到更多的主機號,,應(yīng)該延長主機號的位數(shù),,但是相應(yīng)的,網(wǎng)絡(luò)號的數(shù)量將減少,,因為兩者的總長度是不變的,。 通過掩碼能夠改變網(wǎng)絡(luò)號和主機號的位數(shù)。 通常,,我們看到的掩碼類似: 255.255.255.0 二進制表示:
如果一個IPV4地址為:192.168.1.12 那么IP地址和掩碼經(jīng)過與運算之后的結(jié)果為:192.168.1.0(192.168.001.000), 這就是我們常說的網(wǎng)關(guān),! 而從 192.168.1.1~192.168.1.254都可作為主機號。也即是這個網(wǎng)關(guān)下,,可以容納 254 臺機器,。 如果將掩碼更改為: 255.255.254.0 二進制表示:
那么與運算的結(jié)果為:192.168.0.0 ,這時候可以使用的主機號就變成了 192.168.0.0 ~ 192.168.1.254, 即可容納 510 臺機器,。 2.1.2 IP尋址當(dāng)一個 IP 包從一臺計算機被發(fā)送,,它會到達一個 IP 路由器。 IP 路由器負責(zé)將這個包路由至它的目的地,,直接地或者通過其他的路由器,。 在一個相同的通信中,,一個包所經(jīng)由的路徑可能會和其他的包不同。而路由器負責(zé)根據(jù)通信量,、網(wǎng)絡(luò)中的錯誤或者其他參數(shù)來進行正確地尋址,。 2.1.3 IP協(xié)議的報頭在上面的數(shù)據(jù)分層中,我們看到IP協(xié)議的構(gòu)成實際上是 IP報頭 + TCP協(xié)議內(nèi)容,。 因此決定一個IP協(xié)議屬性的的關(guān)鍵是 IP報頭的內(nèi)容,。 下面我們來看下IP協(xié)議的組成,IPV4中普通的IP首部長20個字節(jié),。其中有32位的源IP地址和32位的目的IP地址。 TTL:生存時間,。代表了數(shù)據(jù)包可以經(jīng)過的最多路由器數(shù),。比如TTL為10,意思是如果經(jīng)過10次路由器轉(zhuǎn)發(fā),,仍然未找到目的地址,,則報文丟棄 8位協(xié)議指示的是傳輸層承載的協(xié)議 16位總長度:指IP數(shù)據(jù)包的最大長度。16bit那么最長可達65535字節(jié),。但是通過鏈路的MTU不會有這么大,。因此如果數(shù)據(jù)包長度超過了MTU,數(shù)據(jù)包會被分片,。如果發(fā)生了分片,,則需要用到16位標識以及13位片偏移來找到分片的報文。 IP協(xié)議報頭 2.2 TCP協(xié)議 2.2.1 TCP協(xié)議作用 TCP協(xié)議位于協(xié)議棧的傳輸層,。當(dāng)應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)摹⒂?位字節(jié)表示的數(shù)據(jù)流,,TCP則把數(shù)據(jù)流分割成適當(dāng)長度的報文段,,最大傳輸段大小(MSS)通常受該計算機連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳送單元(MTU)限制,。之后TCP把數(shù)據(jù)包傳給IP層,,由它來通過網(wǎng)絡(luò)將包傳送給接收端實體的TCP層。 TCP為了保證報文傳輸?shù)目煽?,就給每個包一個序號,,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的字節(jié)發(fā)回一個相應(yīng)的確認(ACK),;如果發(fā)送端實體在合理的往返時延(RTT)內(nèi)未收到確認,,那么對應(yīng)的數(shù)據(jù)(假設(shè)丟失了)將會被重傳,。
在擁塞控制上,,采用廣受好評的TCP擁塞控制算法(也稱AIMD算法),。 該算法主要包括三個主要部分: (1)加性增、乘性減,; (2)慢啟動,; (3)對超時事件做出反應(yīng)。 2.2.2 TCP的報頭和IP協(xié)議一樣,,TCP協(xié)議也有他的報頭部分,。 以下即是圖示: TCP報頭
2.2.2 TCP協(xié)議的連接時候的三次握手TCP是一個面向連接的協(xié)議,,在每一次傳輸數(shù)據(jù)前,客戶端和服務(wù)端需要進行連接,,這個鏈接就是著名的三次握手,。
圖解: TCP的三次握手 思考:為什么要進行三次握手,,而不是兩次呢,? 比如在第一次握手之后,服務(wù)器進入準備狀態(tài),,然后發(fā)送消息給客戶端,,客戶端也進入準備狀態(tài),這就完成了雙方的確認了,。
思考2:三次握手就很安全了嗎,?
#netstat -nap | grep SYN_RECV 2.2.3 TCP協(xié)議的斷開連接時候的四次揮手既然TCP面向連接,,那么肯定也有斷開連接的操作,。一個TCP完整的斷開需要進行四次揮手。
TCP四次揮手 思考:為什么建立連接是三次握手,而關(guān)閉連接卻是四次揮手呢,?
思考:為什么TIME_WAIT狀態(tài)需要經(jīng)過2MSL(最大報文段生存時間)才能返回到CLOSE狀態(tài),?
2.3 UDP協(xié)議UDP協(xié)議全稱是用戶數(shù)據(jù)包協(xié)議,,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,兩者同處于協(xié)議棧的傳輸層,,和TCP不同的是,,UDP是一種無連接的協(xié)議。 因為UDP是無連接的,,所以相對來說,,UDP的報頭比TCP要簡單多了,。 UDP報頭
我們經(jīng)常使用“ping”命令來測試兩臺主機之間TCP/IP通信是否正常,,其實“ping”命令的原理就是向?qū)Ψ街鳈C發(fā)送UDP數(shù)據(jù)包,,然后對方主機確認收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達的消息及時反饋回來,,那么網(wǎng)絡(luò)就是通的,。 2.4 HTTP協(xié)議 HTTP協(xié)議名為超文本傳輸協(xié)議。這個協(xié)議在 TCP/IP 協(xié)議棧的應(yīng)用層,,因此我們無需操心HTTP是如何傳輸?shù)?,只需要關(guān)心,我們傳輸?shù)膬?nèi)容,,能否正確的被接收端識別,。 HTTP 基于TCP實現(xiàn),簡單來說,,TCP協(xié)議負責(zé)可靠的內(nèi)容傳輸,,HTTP協(xié)議負責(zé)識別內(nèi)容,兩者本身不在一個層面,,沒有可比性,。 HTTP無狀態(tài)的意思是,,每一次的內(nèi)容解析是沒有關(guān)聯(lián)的。TCP有狀態(tài)是指兩端在連接過程的,。 HTTP包含兩種報文類型:請求報文,、響應(yīng)報文。請求報文用在客戶端對服務(wù)器的請求時使用的報文格式,,響應(yīng)用在服務(wù)器響應(yīng)請求的報文格式,。 2.4.1 HTTP協(xié)議請求消息結(jié)構(gòu) 客戶端發(fā)送一個HTTP請求到服務(wù)器的請求消息包括以下格式:請求行(request line)、請求頭部(header),、空行和請求數(shù)據(jù)四個部分組成,,下圖給出了請求報文的一般格式。 HTTP請求消息體結(jié)構(gòu) HTTP消息體主要包含以下實質(zhì)內(nèi)容(空格和換行也必不可少):
以下是一個HTTP請求的例子: HTTP請求實例 2.4.1.1 HTTP請求方法 HTTP包含了多種不同的請求方式,每一種請求方式用在不同的場景,。 HTTP請求方法 2.4.1.2 URL —— 統(tǒng)一資源定位符 URL由三部分組成:資源類型、存放資源的主機域名,、資源文件名,。 URL的一般語法格式為: (帶方括號[]的為可選項): protocol :// hostname[:port] / path / [;parameters][?query]#fragment
總結(jié)一下如下圖: 附一張解析圖 2.4.1.3 HTTP請求頭 請求頭中主要包含本次請求的附加信息,,其中常用的字段如:
Date 請求發(fā)送的日期和時間 2.4.1.4 HTTP請求體 在整個報文中,請求頭之后,隔一行空格,,以下部分就是HTTP的請求體了,。 請求體是我們發(fā)送請求的時候需要傳給接收端的內(nèi)容。其格式需要和請求頭中的Content-Type對應(yīng),。不然會導(dǎo)致接受無法識別,。 如上圖中的請求題: name=tom&password=1234 2.4.2 HTTP響應(yīng) HTTP的響應(yīng)同樣分為:響應(yīng)行、響應(yīng)頭,、響應(yīng)體,。和請求報文有點類似。 總體結(jié)構(gòu)如圖: HTTP響應(yīng)報文 2.4.2.1 HTTP響應(yīng)行 響應(yīng)行中包含了HTTP的版本和本次請求的狀態(tài),。請求狀態(tài)的對應(yīng)值見 HTTP響應(yīng)碼大全. 2.4.2.2 HTTP響應(yīng)頭響應(yīng)頭用于描述服務(wù)器的基本信信息、數(shù)據(jù)的描述,,這些信息將告知客戶端如何處理響應(yīng)題中的內(nèi)容,。
2.4.2.3 HTTP響應(yīng)實體 響應(yīng)實體中包含的就是客戶端從服務(wù)器中獲取的數(shù)據(jù)了,。數(shù)據(jù)的格式和長度都會在響應(yīng)體頭中描述。
|
|