協議隨便寫寫

前言

有人讓我寫一篇 http 的博客,但 http 只是應用層協議的一支而已,單獨寫它沒什麼意義,其實我們在大學的時候就已經學過了 OSI 七層協議,只是大多數人沒有特別關注罷了,現在面試比較多的都是問 tcp 協議的三次握手。

協議簡介

不要覺得協議就很高大上,其實在進行 web 開發時,定義給前端的接口文檔,就是協議,一般爲 JSON 數據,只不過 tcp 協議是以 bit 爲單位做字段的,這樣可以儘可能減少數據大小,如果是做硬件端的,則會更加清楚,因爲廠家給過來一般是利用到了每一 bit

OSI 七層協議

標準的七層協議自底向上分爲:物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層,應用層

物理層:網線、路由器、設備也可以說終端,這上面傳的是比特

數據鏈路層:網卡或網絡模塊,格式化數據以進行傳輸,提供錯誤檢測與糾正功能

網絡層:用於確定當前的消息是傳輸給網絡上的哪一臺主機,使用的是 ARP 協議,IP 協議用於定義網絡地址劃分。

傳輸層:定義了一些傳輸協議,如可靠傳輸 TCP ,不可靠傳輸 UDP ,這裏會將數據分段,到達目的地後再進行重組

會話層,表示層和應用層現在是合爲一層應用層,常用的應用層協議有 http、dns,ftp,ssh,telnet,pop3,smtp 等,http 其實是建立在 tcp 協議的基礎上的,以前還有一個 soap 協議,其實它是在 http 協議的 body 中做了下文章,用於 webservice 接口,現在用得少了。

所以我訪問某個網站是怎麼走的呢,首先將域名轉換成 ip 地址使用 dns 協議,請求是走 http 協議, http 協議是建立在 tcp 協議的基礎上的,然後你的消息經過 tcp 協議的包裝,進入網絡層,網絡層根據 arp 協議查詢你的數據要發到鏈路上的哪一臺機器,然後經過網卡,將你的數據格式爲電流信息,然後在物理層網線上傳輸;到達後,經過網卡進行數據還原,然後網絡層接收你的信息,用 rarp 協議還原成 ip 信息,經過 tcp 協議脫殼拿出body 中的 http 協議內容,然後再經過應用解析,再拿出 http 協議中 body 內容,最終到達應用去處理。

TCP/IP 協議

上學的時候書上應該有說過 tcp/ip 協議,它是對利用 ip 通信用到的協議羣的統稱,因爲 tcp 和 ip 是核心,所以叫 tcp/ip 協議。

所以,各層都有一些什麼協議呢


協議
應用層
DHCP · DNS · FTP · Gopher · HTTP · IMAP4 · IRC · NNTP · XMPP · POP3 · SIP · SMTP ·SNMP · SSH · TELNET · RPC · RTCP · RTP ·RTSP · SDP · SOAP · GTP · STUN · NTP · SSDP
表示層
HTTP/HTML · FTP · Telnet · ASN.1(具有表示層功能)
會話層
ADSP·ASP·H.245·ISO-SP·iSNS·NetBIOS·PAP·RPC·RTCP·SMPP·SCP·SSH·ZIP·SDP(具有會話層功能)
傳輸層
TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP
網絡層
IP (IPv4 · IPv6) · ICMP · ICMPv6 · IGMP ·IS-IS · IPsec · BGP · RIP · OSPF ·ARP · RARP
數據鏈路層 Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ATM · DTM · 令牌環 · 以太網路 ·FDDI · 幀中繼 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN ·STP
物理層
以太網路卡 · 調制解調器 · 電力線通信(PLC) · SONET/SDH(光同步數字傳輸網) ·G.709(光傳輸網絡) · 光導纖維 · 同軸電纜 · 雙絞線

下面詳細說下幾種常用的協議

常用的協議有:應用層 http,soap,ssh,dns 域名系統,pop3 smtp 用於郵件的協議,ftp 文件傳輸協議;傳輸層 tcp ,udp ;網絡層 arp/rarp ,ip 協議;數據鏈路層 wifi,2G,3G,4G,5G等

arp/rarp 協議

地址解析協議和逆地址解析協議,用於把 ip 地址和 mac 地址的相互映射。 發送信息時將包含目標IP地址的ARP請求廣播到網絡上的所有主機,並接收返回消息,以此確定目標的物理地址,收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留一定時間,下次請求時直接查詢ARP緩存以節約資源。

ARP 協議與 ARP 欺騙

dns 域名協議

這也是一個映射協議,將域名映射到 ip 地址,基於 UDP 協議,dns 需要解析,第一個解析它的是本機的 hosts 文件,然後纔是由域名服務器進行解析,這也是一些破解軟件將一些地址映射到 0.0.0.0 可以破解的原因。

一個URL 的地址部分由點進行分隔,從後往前數分別是頂級域名,二級域名 ,三級域名,每個域名是可以重複的,所以域名系統整體看起來就是顆樹狀圖,這些域名會由域名服務器解析,詳細解析過程看這篇文章

https://blog.csdn.net/u010331428/article/details/78189195

http 協議 *

學這個協議建議安裝 postman 工具,和使用 IDEA 的 rest-client 工具

http 協議應該說是 web 開發中用得最多的,全稱爲超文本傳輸協議,這個協議不需要專門的抓包工具,使用瀏覽器的網絡面板就可以清晰的看到,一般它的請求格式是這樣子的

img

請求方法有:GET,POST,PUT,DELETE,OPTIONS 等請求方法,但用得比較多的還是 GET 和 POST ,下面只討論 GET 和 POST

其中請求體是我們可以自定義的部分,在請求頭中有一個專門的屬性來描述它是什麼格式的數據 Content-Type

只有 POST 請求才能有請求體,也即只有 POST 請求才有 Content-Type ,GET 請求是沒有的

GET 請求通過在 URL 後面拼接 keyValue 來向服務端傳遞查詢參數,這個參數可以通過 request.getParameter(key) 來獲取 ,在 springmvc 中可以直接寫在參數或使用 @RequestParam 進行接收

POST 請求一般是將數據放在請求體中,使用不同的 content-Type 來描述請求體中的數據,常用的 Content-Type 有 application/x-www-form-urlencoded application/json application/xml multipart/form-data ,當使用 application/json 或者 application/xml 時,在 springmvc 中需要使用 @RequestBody 接收,在 servlet 中使用 request.getInputStream 讀流來獲取數據

當需要傳輸文件時,使用 multipart/form-data 格式,可以把數據以多種格式進行傳輸,每一部分可以對應不同的格式,詳細格式見 rest-client 工具

http 短連接和長連接:http1.1 規定了 http 默認保持長連接,由參數 connection:keep-alive 和 keep-alive:timeout=20 時長來控制 ,這個長連接是說建立的 tcp 是一直連接的,在 http1.0 時代是建立一個 tcp 連接,發起一次請求和響應,然後就斷開 tcp 連接了,但這樣太浪費資源了。

http 是一種無狀態的協議,即不會保存上一次請求和信息,如果需要登錄,需要每次都登錄憑證帶上,這個登錄憑證使用的是 cookies ,但現在應用一般都是多實例應用,或者分佈式的,登錄的用戶信息不會保存在一臺服務中,需要所有用戶共享,解決方案有 session-redis,單點登錄應用,最好用的應該還是屬 jwts ,使用算法來驗證一個用戶信息。

webservice 的 soap 協議是建立在 http 協議上的,它把請求體的格式定義了一下,使用 xml ,並且有固定的格式,這種格式是自描述的,但現在已經用得不多了,因爲太笨重了。

tcp 協議

img

tcp 協議面試問得最多的就是三次握手和四次揮手了,這個看書上的解釋能把頭繞暈,基本本來就一件很簡單的事

假設打電話時信號不好,模擬信道,A:你聽得到嗎?,B:我聽得到,你聽到到嗎?,A:我聽得到;掛電話時,A:我要掛電話了,已中斷數據,B:我知道了,我還有話還沒說完你等會,B:說完了,你全聽到了嗎,A:知道了。

但實際上不會像上面說的那樣簡單,因爲 tcp 會將數據分片,不可能一次性把所有數據傳過去的,這其中的難度讀者可以去做一文件分片上傳就知道了,接收方可能收到的 tcp 分片可能並不是順序的,還有可能丟失,所以要把每一次傳輸標記序號,並且還有一個 ack 確認。

對於三次握手和四次揮手的詳細流程讀者可以翻看大學的書本或參考TCP的三次握手與四次揮手理解及面試題

對於丟包,TCP 有兩種方式來處理丟包問題,詳情見 TCP 是如何解決丟包問題的

上面這些怎麼驗證呢,讀者可以通過 wireshark 去抓一次 http 的包就可以看到了,因爲 http 連接建立前首先要建立 tcp ,如果是網絡環境不好的情況下,將會出現大量的 out-of-order 和 retransmission

ip 協議

只討論 ipv4 ,在 ip 協議中,使用 32 位來對地址進行編碼,ip 地址由兩部分來組成 ,網絡號和主機號,網絡號標識的是Internet上的一個子網,而主機號標識的是子網中的某臺主機。網絡地址分解成兩個域後,帶來了一個重要的優點:IP數據包從網際上的一個網絡到達另一個網絡時,選擇路徑可以基於網絡而不是主機。在大型的網際中,這一點優勢特別明顯,因爲路由表中只存儲網絡信息而不是主機信息,這樣可以大大簡化路由表。IP地址根據網絡號和主機號的數量而分爲A、B、C三類:

A類IP地址:用7位(bit)來標識網絡號,24位標識主機號,最前面一位爲"0",即A類地址的第一段取值介於1~126之間。A類地址通常爲大型網絡而提供,全世界總共只有126個只可能的A類網絡,每個A類網絡最多可以連接16777214臺主機。

B類IP地址:用14位來標識網絡號,16位標識主機號,前面兩位是"10"。B類地址的第一段取值介於128~191之間,第一段和第二段合在一起表示網絡號。B類地址適用於中等規模的網絡,全世界大約有16000個B類網絡,每個B類網絡最多可以連接65534臺主機。

C類IP地址:用21位來標識網絡號,8位標識主機號,前面三位是"110"。C類地址的第一段取值介於192~223之間,第一段、第二段、第三段合在一起表示網絡號。最後一段標識網絡上的主機號。C類地址適用於校園網等小型網絡,每個C類網絡最多可以有254臺主機。

所以我們看一個 ip 地址是哪一類時,只需要看第一段是在哪個範圍中,比如常見的 192.x.x.x 就是 C 類 Ip 地址。

那子網又是什麼呢,我們經常在配置網絡的時候需要配置子網掩碼,子網是爲了劃分出更小的網絡,如在一個公司有 A,B 兩個部門,如果運維想劃分成兩個子網的話也是可以的,但一般不會這麼幹,因爲這樣兩個部門的主機之間不能直接連通了,並且這個子網會佔用主機號的位置,使可以配置的主機數更少了。例如 ,配置了一個C 類地址,只允許 254 臺主機,如果再使用子網,每個部門就只能 127 臺主機,如果B 部門有 200 個人,而 A 部門有 53 個人就配置不了。

子網掩碼是這樣的規則,我們先得看這個地址是A類還是B類還是 C 類,然後判斷主機號的位置,然後掩碼在本來主機位的位置佔用爲 1,不佔用爲 0 ,代表不同的子網,例如常見的設置 255.255.255.0 在 C 類地址中就是沒有設置子網,允許 254 臺主機。

你可能注意到了,C 類地址中 2 的 8 次方應該是 256 臺主機,但爲什麼只有 254 臺呢,因爲地址全 0 和全 1 有不同的意義 ,主機位全爲 0 時表示子網地址,全爲 1 時表示廣播地址。

經常看到這種寫法:192.168.1.0/24 這個 24 表示的就是前 24 位是網絡號,從 192 可以看出是一個 C 類 ip 地址

變長掩碼 ,前面A,B 部門說了,存在主機數分配不均的情況,這時就需要變長掩碼,這屬於運維的知識了,就不詳細說明了

我的博文大綱:https://blog.csdn.net/sanri1993/article/details/52201255

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章