”,與百萬(wàn)開(kāi)發(fā)者在一起來(lái)源 | java小杰要加油(ID:xhJaver)
今天來(lái)分享一個(gè)關(guān)于計算機網(wǎng)絡(luò )的知識點(diǎn)——網(wǎng)絡(luò )到底是怎么連接的?
瀏覽器生成消息且發(fā)送
生成HTTP請求消息
舉個(gè)栗子,當我們在瀏覽器輸入https://www.jdl.cn/img/service.843585b7.png網(wǎng)絡(luò )地址的時(shí)候
- 瀏覽器首先會(huì )對URL進(jìn)行解析
- https:表示訪(fǎng)問(wèn)數據源的機制,也就是協(xié)議
- www.jdl.cn: web服務(wù)器名稱(chēng)
- service.843585b7.png:表示文件名 然后就要生成HTTP消息了,它大概長(cháng)這樣
DNS域名解析為IP地址
瀏覽器生成了這個(gè)HTTP消息后,它要往哪里發(fā)送呢?當然是服務(wù)器啦,所以就要解析這個(gè)域名對應的是哪臺服務(wù)器,IP地址是什么,因為IP地址不好記,所以才有了對應的域名,便于我們人類(lèi)記憶。
- 瀏覽器會(huì )檢查緩存有沒(méi)有這個(gè)域名對應的ip地址
- 操作系統會(huì )檢查緩存(就是我們平常說(shuō)的hosts文件)
- 操作系統會(huì )發(fā)送給本地區的DNS服務(wù)器,讓它幫忙解析下 DNS服務(wù)器接受來(lái)自客戶(hù)端的查詢(xún),包括以下三個(gè)內容
- 域名:服務(wù)器,郵件服務(wù)器的名稱(chēng)
- Class:在最早設計DNS時(shí),DNS在互聯(lián)網(wǎng)以外的其他網(wǎng)絡(luò )中的應用也被考慮到了,而Class就是用來(lái)識別網(wǎng)絡(luò )信息的,不過(guò)如今除了互聯(lián)網(wǎng)就沒(méi)有其他網(wǎng)絡(luò )了,因此Class的值永遠代表互聯(lián)網(wǎng)的IN
- 記錄類(lèi)型:表示域名對應何種記錄類(lèi)型
- MX時(shí),表示域名對應的是郵件服務(wù)器 對于不同的記錄類(lèi)型,響應數據也不一樣
域名的層次結構
- 越靠右層次越高,從右向左一級一級的劃分 : 例如 www.jdl.cn 就是cn->jdl->www
- 具有這種層次結構的域名信息都會(huì )注冊到DNS服務(wù)器中,而每個(gè)域都是作為一個(gè)整體來(lái)處理的 客戶(hù)端和DNS服務(wù)器交互流程大概如下
- 上級DNS服務(wù)器中要注冊其下級域的DNS服務(wù)器IP地址,然后上級DNS服務(wù)器IP地址要注冊到更上一級的DNS服務(wù)器中,此次類(lèi)推
- 根域的DNS服務(wù)器信息保存到互聯(lián)網(wǎng)中所有的DNS服務(wù)器中,這樣的話(huà),所有的DNS服務(wù)器都會(huì )找到根域,然后一級一級的往下找,直到找到自己想要的那個(gè)域名
- 分配給根域的IP地址僅有13個(gè),就是頂級域名(com,cn等)對應的ip地址具體交互就是下面這樣
但是一臺服務(wù)器存不下這么多,所以一般都是DNS服務(wù)器大接力來(lái)尋找這個(gè)ip地址,圖如下
客戶(hù)端找到最近的DNS服務(wù)器,查找www.jdl.cn的信息,可是最近的DNS服務(wù)器沒(méi)有這個(gè)信息,就轉發(fā)到了根域服務(wù)器下,經(jīng)過(guò)判斷發(fā)現是cn的頂級域名的,于是根域DNS服務(wù)器會(huì )返回它所管理的cn域中的DNS服務(wù)器的ip地址,接下來(lái),最近的這個(gè)DNS服務(wù)器又回去訪(fǎng)問(wèn)com域名的服務(wù)器,以此類(lèi)推,最終會(huì )找到 www.jdl.cn這個(gè)服務(wù)器的IP地址
委托協(xié)議棧發(fā)送消息
知道了IP地址后,就可以委托操作系統內部的協(xié)議棧向這個(gè)目標IP地址發(fā)送消息了
- 瀏覽器、郵件等一般應用程序收發(fā)數據時(shí)用TCP
- DNS查詢(xún)等收發(fā)較短的控制數據用UDP
網(wǎng)絡(luò )分層
開(kāi)放式系統互聯(lián)通信參考模型(英語(yǔ):Open System Interconnection Reference Model,縮寫(xiě)為 OSI),簡(jiǎn)稱(chēng)為OSI模型(OSI model),一種概念模型,由國際標準化組織提出,一個(gè)試圖使各種計算機在世界范圍內互連為網(wǎng)絡(luò )的標準框架。定義于ISO/IEC 7498-1。
TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/網(wǎng)際協(xié)議)TCP/IP協(xié)議不僅僅指的是TCP 和IP兩個(gè)協(xié)議,而是指一個(gè)由FTP、SMTP、TCP、UDP、IP等協(xié)議構成的協(xié)議簇, 只是因為在TCP/IP協(xié)議中TCP協(xié)議和IP協(xié)議最具代表性,所以被稱(chēng)為T(mén)CP/IP協(xié)議
客戶(hù)端服務(wù)器傳遞數據流程
- 一個(gè)數據包從客戶(hù)端到服務(wù)端中間經(jīng)過(guò)每一層都需要加工處理
- 服務(wù)端這邊需要不斷的拆分這個(gè)數據包
三次握手
當兩臺計算機要傳遞數據的時(shí)候,一定要先連接,得經(jīng)過(guò)TCP三次握手吧(僅僅指指走TCP協(xié)議需要連接的),我們平常都說(shuō)TCP連接要經(jīng)過(guò)三次握手,我們就來(lái)看一下到底什么是TCP三次握手,如圖所示
- 客戶(hù)端要發(fā)送的時(shí)候,主動(dòng)從closed狀態(tài)打開(kāi),服務(wù)器啟動(dòng)后就一直處于監聽(tīng)LISTEN狀態(tài)
- 客戶(hù)端發(fā)送 SYN = 1,seq = x 給服務(wù)端,客戶(hù)端處于SYN_SEND狀態(tài)。
- 服務(wù)端收到后給客戶(hù)端發(fā)送 SYN = 1,ACK =1, seq = y,ack = x+1。此時(shí)服務(wù)端處于SYN_RCVD狀態(tài)
- 客戶(hù)端收到后發(fā)送ACK =1, seq = x+1,ack = y+1給服務(wù)器,此時(shí)客戶(hù)端狀態(tài)是ESTAB-LISHED
- 服務(wù)端收到后狀態(tài)變?yōu)?strong>ESTAB-LISHED
- 三次握手通過(guò)后,就代表客戶(hù)端和服務(wù)端可以傳遞數據包進(jìn)行交互啦
- 我們說(shuō)到SYN,ACK,seq,ack這些又是什么呢?這些其實(shí)是TCP數據包里的屬性,我們接著(zhù)往下看(在傳輸層中有解釋)
應用層
HTTP數據包拆分
- 一般HTTP請求消息不會(huì )太長(cháng),一個(gè)網(wǎng)絡(luò )包就能裝的下
- 發(fā)送緩沖區中的數據如果超過(guò)MSS的長(cháng)度,就會(huì )被以MSS長(cháng)度進(jìn)行拆分放進(jìn)單獨的網(wǎng)絡(luò )包中
- MTU(Maximum Transmission Unit):一個(gè)網(wǎng)絡(luò )包的最大長(cháng)度,以太網(wǎng)中一般是1500字節
- MSS(Maximum Segment Size):除去頭部之后,一個(gè)網(wǎng)絡(luò )包所容納的TCP數據的最大長(cháng)度
傳輸層
- 然后上面應用層的這個(gè)網(wǎng)絡(luò )包再加上TCP頭部
TCP報文格式
- 源端口號(16位):發(fā)送網(wǎng)絡(luò )包的端口號
- 目的端口號(16位):網(wǎng)絡(luò )包的接受方的端口號
- 序號(發(fā)送數據的順序編號)(32位):發(fā)送方告知接收方已經(jīng)收到了所有數據的第幾個(gè)字節
- 確認序號(接收數據的順序編號)(32位):接收方告知發(fā)送方接收方已經(jīng)收到了所有數據的第幾個(gè)字節
- 頭部長(cháng)度(4位):表示數據的起始部分,數據偏移量
- 控制位(6位):該字段中的每個(gè)比特位分別表示以下通信控制的含義
- ACK:表示接收數據序號字段有效,一般表示數據已被接收方收到
- PSH:表示通過(guò)flush操作發(fā)送的數據
- RST:強制斷開(kāi)連接,用于異常中斷的情況
- SYN:發(fā)送方和接收方相互確認序號,表示連接操作
- 窗口大?。?6位):接收方告知發(fā)送方窗口大?。礋o(wú)需等待確認可一起發(fā)送的數據)
- 可選字段(可變長(cháng)度):除了上面的固定頭部字段外,還可以添加可選字段,但除了連接操作外,很少使用可選字段
還記得三次握手提到過(guò)的各種序號嗎,就是這個(gè)報文里的屬性
網(wǎng)絡(luò )層
- 然后上面這個(gè)網(wǎng)絡(luò )包再加上IP頭部
IP報文格式
- 版本號(4比特):IP協(xié)議版本號,目前是版本4
- 頭部長(cháng)度(4比特):IP頭部的長(cháng)度,可選字段可導致頭部長(cháng)度的變化,因此這里需要指定頭部的長(cháng)度
- 服務(wù)類(lèi)型(TOS)(8比特):表示包傳輸優(yōu)先級。最初的協(xié)議規格里對這個(gè)參數的定義很模糊,最近DIFFServ規則重新定義了這個(gè)字段的用法
- 總長(cháng)度(16比特):表示IP消息的總長(cháng)度
- ID號(16比特):用于識別包的編號,一般為的序列號。如果一個(gè)包被IP分片,則所有分片都擁有相同的ID
- 標志(Flag)(3比特):該字段有3個(gè)比特,其中2個(gè)比特有效,分別代表是否允許分片,以及當前分片是否為分片包
- 分片偏移量(13比特):表示當前包的內容為整個(gè)IP消息的第幾個(gè)字節開(kāi)始的內容
- 生存時(shí)間(TTL)(8比特):表示包的生存時(shí)間,這是為了避免網(wǎng)絡(luò )出現回環(huán)時(shí)一個(gè)包永遠在網(wǎng)絡(luò )中打轉。每經(jīng)過(guò)一個(gè)路由器,這個(gè)值就會(huì )減一,減到0的是hi這個(gè)包就會(huì )被丟棄
- 協(xié)議號(8比特):協(xié)議號表示協(xié)議的類(lèi)型(以下均為16進(jìn)制)
- 頭部校驗和(16比特):用于檢查錯誤,現在已經(jīng)不在使用
- 發(fā)送方IP地址(32比特):網(wǎng)絡(luò )包發(fā)送方的IP地址
- 接收方IP地址(32比特):網(wǎng)絡(luò )包接收方的IP地址
- 可選字段(可變長(cháng)度):除了上面的固定頭部字段外,還可以添加可選字段,但除了連接操作外,很少使用可選字段
- 然后這個(gè)網(wǎng)絡(luò )包再加上MAC頭部
MAC數據包
- 接收方MAC地址(48比特):網(wǎng)絡(luò )包接收方的MAC地址,在局域網(wǎng)中使用這一地址來(lái)傳輸網(wǎng)絡(luò )包
- 發(fā)送方MAC地址(48比特):網(wǎng)絡(luò )包發(fā)送方的MAC地址,接收方通過(guò)它來(lái)判斷是誰(shuí)發(fā)送了這個(gè)網(wǎng)絡(luò )包
- 以太類(lèi)型(16比特):使用的協(xié)議類(lèi)型。下面是一些常見(jiàn)的類(lèi)型,一般在TCP/IP通信中只是用0800和0806這兩種。
MAC地址 VS IP地址
- 為什么需要MAC數據包呢?因為在以太網(wǎng)的世界中,TCP/IP這個(gè)思路是行不通的。
- 以太網(wǎng)在判斷網(wǎng)絡(luò )包目的地時(shí)和TCP/IP的方式不同,因此必須采用想匹配的方式才能在以太網(wǎng)中將包發(fā)往目的地,而MAC地址就是干這個(gè)的
- 發(fā)送方MAC地址:MAC地址是寫(xiě)在網(wǎng)卡生產(chǎn)時(shí)寫(xiě)入ROM里的,只需要將這個(gè)值讀取出來(lái)寫(xiě)入MA頭部就好了
發(fā)送方的MAC地址還比較容易獲取到,但是接收方的MAC地址就不太容易獲取到了
ARP廣播
- ARP :Addresss Resolution Protocal 地址解析協(xié)議
- 根據IP地址查詢(xún)接收方MAC地址的時(shí)候會(huì )用到ARP廣播
- 在同一個(gè)子網(wǎng)中,利用廣播對所有設備提問(wèn) XXX這個(gè)ip地址是誰(shuí)的,其他設備發(fā)現自己的ip地址是這個(gè)xxx的話(huà),那么他就會(huì )把它的MAC地址告訴提問(wèn)者,這樣就會(huì )檢測到接收方的MAC地址了,如果發(fā)現自己的ip地址不是這個(gè)XXX,那么則會(huì )丟棄這個(gè)消息并不去理會(huì )。
- 如果每次都去廣播的話(huà),那么網(wǎng)絡(luò )中就會(huì )增加很多ARP包,所以為了提高效率,我們有ARP緩存在內存中。查詢(xún)之前先去查詢(xún)ARP緩存。
- 當目的地的IP地址對應的MAC地址變了的話(huà),那么這個(gè)MAC緩存就會(huì )出問(wèn)題,所以為了避免這種問(wèn)題發(fā)生,這個(gè)緩存幾分鐘后會(huì )被刪除,非常簡(jiǎn)單粗暴。
- 靜態(tài)ARP:手工維護,不會(huì )自動(dòng)失效
- 動(dòng)態(tài)ARP:會(huì )過(guò)段時(shí)間自動(dòng)失效(文中說(shuō)的就是它)
- MAC頭部:以太網(wǎng)用的頭部,包含MAC地址
總體數據包
這個(gè)時(shí)候的數據包變成了這個(gè)樣子
MTU(Maximum Transmission Unit):一個(gè)網(wǎng)絡(luò )包的最大長(cháng)度,以太網(wǎng)中一般是1500字節
MSS(Maximum Segment Size):除去頭部之后,一個(gè)網(wǎng)絡(luò )包所容納的TCP數據的最大長(cháng)度
然后這數據包,沿著(zhù)網(wǎng)卡出去,到集線(xiàn)器,路由器一頓傳輸(中間涉及到電信號轉換等等),到達服務(wù)端那邊,再一層一層的扒皮(前往中說(shuō)過(guò),一層一層的拆分數據包)
斷開(kāi)連接
四次揮手
兩臺計算機最后連接結束后要斷開(kāi)連接,進(jìn)行四次揮手
其實(shí)三次握手,四次揮手還有好多好多知識點(diǎn)要說(shuō),像什么為什么握手需要三次,而揮手需要四次啦這些問(wèn)題,以后小杰會(huì )單獨和大家聊這個(gè),記得收看呀
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。