淺入HTTP

## OSI模型wiki

(開放式系統(tǒng)互聯(lián)通信參考模型)(1984年)

  1. 應(yīng)用層--提供為應(yīng)用軟件而設(shè)的接口,以設(shè)置與另一應(yīng)用軟件之間的通信。例如: HTTP,HTTPS,F(xiàn)TP,TELNET,SSH,SMTP,POP3等。
  2. 表示層--把數(shù)據(jù)轉(zhuǎn)換為能與接收者的系統(tǒng)格式兼容并適合傳輸?shù)母袷健?/li>
  3. 會話層--負責(zé)在數(shù)據(jù)傳輸中設(shè)置和維護計算機網(wǎng)絡(luò)中兩臺計算機之間的通信連接。
  4. 傳輸層--把傳輸表頭(TH)加至數(shù)據(jù)以形成數(shù)據(jù)包。傳輸表頭包含了所使用的協(xié)議等發(fā)送信息。例如:TCP、UDP等。
  5. 網(wǎng)絡(luò)層--決定數(shù)據(jù)的路徑選擇和轉(zhuǎn)寄,將網(wǎng)絡(luò)表頭(NH)加至數(shù)據(jù)包,以形成分組。網(wǎng)絡(luò)表頭包含了網(wǎng)絡(luò)數(shù)據(jù)。例如:互聯(lián)網(wǎng)協(xié)議(IP)等。
  6. 數(shù)據(jù)鏈路層--負責(zé)網(wǎng)絡(luò)尋址、錯誤偵測和改錯。當(dāng)表頭和表尾被加至數(shù)據(jù)包時,會形成幀。數(shù)據(jù)鏈表頭(DLH)是包含了物理地址和錯誤偵測及改錯的方法。數(shù)據(jù)鏈表尾(DLT)是一串指示數(shù)據(jù)包末端的字符串。例如以太網(wǎng)、無線局域網(wǎng)(Wi-Fi)和通用分組無線服務(wù)(GPRS)等。
  7. 物理層--在局部局域網(wǎng)上傳送數(shù)據(jù)幀(data frame),它負責(zé)管理計算機通信設(shè)備和網(wǎng)絡(luò)媒體之間的互通。包括了針腳、電壓、線纜規(guī)范、集線器、中繼器、網(wǎng)卡、主機適配器等。

ps. 已被TCT/IP四層模型替代

TCP/IP四層模型

  1. 應(yīng)用層--是大多數(shù)普通與網(wǎng)絡(luò)相關(guān)的程序為了通過網(wǎng)絡(luò)與其他程序通信所使用的層。這個層的處理過程是應(yīng)有特有的;數(shù)據(jù)從網(wǎng)絡(luò)相關(guān)的程序以這種應(yīng)用內(nèi)部使用的格式進行傳送,然后被編碼成標(biāo)準(zhǔn)協(xié)議的格式。每一個應(yīng)用層協(xié)議一般都會使用到傳輸層協(xié)議TCP和UDP協(xié)議之一:
    運行在TCP協(xié)議上的協(xié)議:
     1. HTTP(80端口),主要用于普通瀏覽。
     2. HTTPS(443端口),HTTP協(xié)議的安全版本。
     3. FTP(20和21端口),顧名思義,用于文件傳輸
     4. POP3(110端口),收郵件用。
     5. SMTP(25端口),用來發(fā)送電子郵件。
     6. SSH(22端口),用于加密安全登錄用。
    運行在UDP協(xié)議上的協(xié)議:
     1. DHCP(67端口,動態(tài)主機配置協(xié)議),動態(tài)配置IP地址。
    其他:
     1. DNS(Domain Name Service,域名服務(wù)),用于完成地址的查找,郵件轉(zhuǎn)發(fā)等工作(運行在TCP和UDP協(xié)議上)。
     2. SNMP(Simple Network Management Protocol,簡單網(wǎng)絡(luò)管理協(xié)議),用于網(wǎng)絡(luò)信息的收集和網(wǎng)絡(luò)管理。
     3. ARP(Address Resolution Protocol,地址解析協(xié)議),用于動態(tài)解析以太網(wǎng)硬件的地址。
  2. 傳輸層--解決諸如端到端可靠性(數(shù)據(jù)是否已經(jīng)到達目的地?)和保證數(shù)據(jù)按照正確的順序到達這樣的問題。TCP、UDP都是傳輸層協(xié)議。
  3. 網(wǎng)絡(luò)層--解決在一個單一網(wǎng)絡(luò)上傳輸數(shù)據(jù)包的問題。IP協(xié)議是網(wǎng)絡(luò)層協(xié)議。
  4. 數(shù)據(jù)鏈路層--它是數(shù)據(jù)包從一個設(shè)備的網(wǎng)絡(luò)層傳輸?shù)搅硗庖粋€設(shè)備的網(wǎng)絡(luò)層的方法。這個過程能夠在網(wǎng)卡的軟件驅(qū)動程序中控制或者專用芯片中控制。這將完成如添加報頭準(zhǔn)備發(fā)送、通過實體介質(zhì)實際發(fā)送這樣一些數(shù)據(jù)鏈路功能。另一端,鏈路層將完成數(shù)據(jù)幀接收、去除報頭并且將接收到的包傳到網(wǎng)絡(luò)層。

一般的web應(yīng)用的通信傳輸流是這樣的:


發(fā)送端在層與層之間傳輸數(shù)據(jù)時,每經(jīng)過一層時會被打上一個該層所屬的首部信息。反之,接收端在層與層之間傳輸數(shù)據(jù)時,每經(jīng)過一層時會把對應(yīng)的首部信息去除。

TCP三步握手(建立連接之前做的事情)

關(guān)于TCP:
TCP(Transmission Control Protocol, 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。與之對應(yīng)的是UDP(User Datagram Protocol ,用戶數(shù)據(jù)報協(xié)議),是不可靠的傳輸層協(xié)議。

解讀上圖
客戶端發(fā)送 SYN 報文給服務(wù)器端,序列號是 x,進入 SYN_SEND 狀態(tài)。
服務(wù)器端收到 SYN 報文,回應(yīng)一個ACK(序列號是x+1)同時發(fā)一個 SYN (序列號是 y ),進入 SYN_RECV 狀態(tài)。
客戶端收到服務(wù)器端的 SYN 報文,回應(yīng)一個 ACK(序列號是 y+1 )報文,進入 Established 狀態(tài)。

通俗來說:

  1. 客戶端發(fā)出第一次請求:對服務(wù)器發(fā)出詢問(使用 SYN = 1 這個詢問記號),和內(nèi)容seq = x (表示此次收到請在此做標(biāo)記) 。
  2. 服務(wù)器收到請求:服務(wù)器收到請求后打上回應(yīng)記號( ACK = 1 ),并把客戶的 seq 內(nèi)容加 1 記錄成 ack = x+1(回應(yīng)值),同時加上自己的內(nèi)容 seq = y,然后服務(wù)器也要確認一下客戶是否回到自己的回應(yīng),所以也需要加上詢問記號( SYN = 1 )。
  3. 客戶收到服務(wù)器的回應(yīng)以后也打上回應(yīng)記號( ACK = 1 ),并把服務(wù)器的 seq 內(nèi)容加 1 記錄成 ack = y+1(回應(yīng)值),同時加上自己的內(nèi)容 seq = x+1。

四步揮手(通信結(jié)束時做的事情)

解讀上圖

  1. 客戶端發(fā)送一個 FIN ,告訴服務(wù)器想關(guān)閉連接。
  2. 服務(wù)器收到這個 FIN ,發(fā)回一個 ACK。
  3. 服務(wù)器通知應(yīng)用程序關(guān)閉網(wǎng)絡(luò)連接,應(yīng)用程序關(guān)閉后通知服務(wù)器。服務(wù)器發(fā)送一個 FIN 給客戶端 。
  4. 客戶端發(fā)回 ACK 報文確認。

通俗來說

  1. 客戶端先發(fā)送結(jié)束信號(使用 FIN = 1 這個標(biāo)記),和內(nèi)容 seq = u 。
  2. 服務(wù)器收到請求后,先發(fā)一次通訊告訴客戶端已經(jīng)收到你的結(jié)束請求啦(并通知應(yīng)用程序們結(jié)束),打上回應(yīng)記號( ACK = 1 ),并把服務(wù)器的 seq 內(nèi)容加 1 記錄成 ack = u+1(回應(yīng)值),同時加上自己的內(nèi)容 seq = v。
  3. 然后服務(wù)器等到應(yīng)用程序結(jié)束(應(yīng)用程序收到結(jié)束信號以后趕緊發(fā)完數(shù)據(jù),然后告訴服務(wù)器你可以結(jié)束了),然后服務(wù)器就再次發(fā)送一次通訊,這次也加上結(jié)束信號 FIN = 1 、回應(yīng)記號 ACK = 1,內(nèi)容 seq = w,回應(yīng)值 ack = u+1
  4. 客戶端收到服務(wù)器也結(jié)束的響應(yīng)以后,最后發(fā)送一次通訊告訴服務(wù)器自己收到了結(jié)束響應(yīng),最后此次通訊結(jié)束。

為什么揮手要四步

這是因為服務(wù)端的 LISTEN 狀態(tài)下的 SOCKET 當(dāng)收到客戶端建立連接請求的SYN 報文后,它可以把 ACK 和 SYN ( ACK 起應(yīng)答作用,而 SYN 起同步作用)放在一個報文里來發(fā)送。
但關(guān)閉連接時,當(dāng)服務(wù)器收到客戶端的 FIN 報文通知時,服務(wù)器只能發(fā)一個回應(yīng)報文ACK:“哦,我知道了”,然后通知應(yīng)用程序。(正式因為這里服務(wù)器與應(yīng)用程序通知結(jié)束的時間間隔,所以結(jié)束需要四步,不能把第二第三步合成一步)
應(yīng)用程序完成全部數(shù)據(jù)發(fā)送并確定可以終止了,服務(wù)器才能發(fā)送FIN告訴客戶端可以真正斷開連接了。所以這一步ACK報文和FIN報文需要分開發(fā)送,因此多了一個步驟。

TCP報文格式

  • ACKTCP 協(xié)議規(guī)定,只有 ACK=1 時有效,也規(guī)定連接建立后所有發(fā)送的報文的 ACK 必須為 1
  • SYN (SYNchronization) : 在連接建立時用來同步序號。當(dāng) SYN = 1ACK = 0 時,表明這是一個連接請求報文。對方若同意建立連接,則應(yīng)在響應(yīng)報文中使 SYN=1ACK = 1. 因此, SYN1 就表示這是一個連接請求或連接接受報文。
  • FIN (finis)即完,終結(jié)的意思, 用來釋放一個連接。當(dāng) FIN = 1 時,表明此報文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放連接。

參考

·

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容