思維導圖(復習范圍)

計算機網(wǎng)絡體系結(jié)構(gòu)
OSI七層結(jié)構(gòu)概念非常清晰,理論比較完整,但是他不實用,也很復雜。
TCP/IP是一個四層的結(jié)構(gòu),一般應用廣泛。
五層體系結(jié)構(gòu)則是綜合了這兩個模型的優(yōu)點,比較易懂,和四層的區(qū)別就是把網(wǎng)絡接口層換成數(shù)據(jù)鏈路層和物理層。

五層體系中應用層是通過兩個應用之間的的通信交互來完成特定網(wǎng)絡應用,協(xié)議有域名解析DNS,HTTP協(xié)議。
運輸層是提供數(shù)據(jù)傳輸服務給兩臺主機,協(xié)議有tcp或者udp協(xié)議。
網(wǎng)絡層是選擇合適的網(wǎng)絡路由和交換節(jié)點,把運輸層的數(shù)據(jù)分組進行傳輸,協(xié)議有ip協(xié)議。
數(shù)據(jù)鏈路層是把數(shù)據(jù)封裝成幀進行傳輸,物理層是比特流形式傳輸。
應用層協(xié)議
- 基于TCP的應用層協(xié)議有:HTTP、FTP、SMTP、TELNET、SSH、pop3
- 基于UDP的應用層協(xié)議:DNS、TFTP(簡單文件傳輸協(xié)議)、SNMP:簡單網(wǎng)絡管理協(xié)議
TCP與UDP
TCP是可靠的,面向連接的傳輸服務,所以一般用于文件傳輸,遠程登錄等場景。UDP則相反,是不可靠的,盡力把數(shù)據(jù)傳輸過去,不考慮是否發(fā)錯,無連接的服務。用于語音,視頻,直播等場景。
TCP特點
1.是有連接的,每次通信都要通過三次握手來建立連接,四次揮手來釋放鏈接。
2.全雙工通信,雙方都可以隨時進行發(fā)送,兩端都有緩存
3.是點對點的連接,只能一對一
4.可靠的傳輸,不會有丟失,錯誤,亂序。
UDP特點
1.無連接的
2.盡最大努力進行數(shù)據(jù)傳輸,不考慮發(fā)送是否正確
3.面向報文
4.沒有擁塞控制,在網(wǎng)絡擁塞的時候,不會使發(fā)送速率變低。
5.可以一對一也可以一對多。
6.UDP首部開銷比TCP小,只有8個字節(jié)
三次握手與四次揮手

TCP中建立連接是用三次握手的方式,這里的ack是確認號,ACK則是確認字段,兩者不太一樣。
一開始客戶端主動打開連接,去向服務器端發(fā)送請求報文,此時服務器端收到請求報文后,就會跟客戶端進行確認,表示自己已經(jīng)收到了,那客戶端收到后,就會進入ESTABLISHED狀態(tài)(已經(jīng)建立連接)。
但是這個時候為什么客戶端會再發(fā)送一次呢,假設沒有第三次的請求發(fā)送,那么就是客戶端發(fā)出請求,服務器端確認并發(fā)送回復,這樣子就建立連接了。假設有一種情況,當客戶端發(fā)送的請求因為請求報文丟失而沒有收到服務器端的確認,那么就會重新發(fā)送一次請求連接報文,這個時候服務器收到并發(fā)送確認。如果客戶端第一次發(fā)送的請求因為網(wǎng)絡問題,延遲到很久之后才發(fā)送到服務器端,那么服務器端就會誤以為這是一個新的連接,就會表示已經(jīng)收到,發(fā)送確認報文??蓪嶋H上這個時候客戶端并沒有發(fā)送請求連接,那么就不會去管服務器的確認報文,服務器則一直在等著客戶端發(fā)送數(shù)據(jù),造成資源浪費。所以才要采用三次握手,讓客戶端再次發(fā)送一次確認報文給服務器端。

連接釋放的過程是客戶端先向服務器端發(fā)送信息,服務器端收到后會立馬返回確認信息,但是這個時候服務器端可能還有數(shù)據(jù)要進行發(fā)送,所以服務器端要等到發(fā)送完全部數(shù)據(jù)后再發(fā)送釋放連接的信息,客戶端收到這個信息后,立馬進行確認,同時要等待一段時間再關(guān)閉,如圖的計時等待,最后服務器端收到確認信息并關(guān)閉。
為什么要等待一段時間再關(guān)閉呢,這是因為如果客戶端確認的報文丟失了,那么服務器端收不到就會進行重新發(fā)送,這個時候要是客戶端立馬關(guān)閉就收不到了,所以要等一段時間才可以關(guān)閉。同樣要是出現(xiàn)延遲很長時間才發(fā)送到的情況,客戶端也已經(jīng)關(guān)閉了,就不會去理睬。
擁塞控制
在計算機網(wǎng)絡中的鏈路容量(即帶寬)、交換結(jié)點中的緩存和處理機等,都是網(wǎng)絡的資源。在某段時間,若對網(wǎng)絡中某一資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡的性能就會變壞。這種情況就叫做擁塞。
先介紹一下基本概念,cwnd是發(fā)送方維護的一個根據(jù)網(wǎng)絡動態(tài)變化的窗口,ssthresh是一個閾值,
慢開始:一開始不太清楚網(wǎng)絡的實際情況,不能一窩蜂的把數(shù)據(jù)全部塞進去,要先試探一下,即從小到大慢慢增大cwnd,初始值為1,經(jīng)過一個RTT(傳輸輪次),cwnd就會翻倍,這個時候如果cwnd大于ssthresh的話,那么就會轉(zhuǎn)變成擁塞避免算法。
擁塞避免:讓cwnd緩慢增大,即每個RTT讓cwnd+1。避免增長過快然后導致網(wǎng)絡擁塞。
如果在慢開始或者擁塞避免階段發(fā)生了網(wǎng)絡出現(xiàn)擁塞,那么ssthresh就會變?yōu)榇藭r的發(fā)送窗口的一半(不能小于2),并且cwnd會從1重新開始。
快重傳與快恢復:如果接收方收到的數(shù)據(jù)沒有按序傳輸過來,就馬上發(fā)送重復確認(讓發(fā)送方馬上知道有數(shù)據(jù)沒有按序傳輸),如果發(fā)送方收到三個重復的確認,那么就會立即重傳沒收到的數(shù)據(jù)
此時ssthresh會減半,并且發(fā)送方認為這個時候很有可能不會網(wǎng)絡阻塞,那么就不用cwnd從1開始,而是初始值為減半后的ssthresh,然后執(zhí)行擁塞避免算法慢慢增大。

Tcp如何保證可靠傳輸
1.Tcp會給發(fā)送的數(shù)據(jù)包進行編號,接收方進行排序,把有序數(shù)據(jù)傳送給應用層。
2.校驗和,tcp會保持首部和數(shù)據(jù)的校驗和,是一個端到端的校驗和,如果在發(fā)送過程中校驗和出現(xiàn)了任何變化,那么接收方就會丟棄這個報文段,并不確認收到此報文段。
3.擁塞控制:當網(wǎng)絡擁塞時,減少數(shù)據(jù)的傳輸量
4.Tcp的接收端會丟棄重復數(shù)據(jù)。
5.流量控制:Tcp兩個端都有固定大小的緩沖區(qū)域,如果接收方來不及處理發(fā)送方的數(shù)據(jù),就會提醒發(fā)送方降低速率,不要發(fā)送過多數(shù)據(jù)導致數(shù)據(jù)丟失。用的是滑動窗口來實現(xiàn)流量控制。
6.ARQ協(xié)議(停止與等待ARQ協(xié)議,連續(xù)ARQ協(xié)議)
7.超時重傳:當tcp發(fā)送方發(fā)出一個報文段之后,就啟動一個計時器,如果在這個時間內(nèi)沒有得到接收端發(fā)回來的確認,就重新發(fā)送。
http與https
- 兩者用的是不同的連接形式,http默認端口號是80,https默認端口號是443.
- https需要ca申請證書,一般很少免費證書,需要一定費用
- http傳輸?shù)膬?nèi)容都是明文,客戶端和服務器無法驗證對方身份。https是運行在SSL/TLS之上的http協(xié)議。https傳輸?shù)膬?nèi)容經(jīng)過加密了,加密采用對稱加密,因為傳輸速度快,但對稱加密的密鑰用服務器方的證書進行了非對稱加密,因為較難破解。http的安全性沒有https高,同樣https比http耗費更多的服務器資源。
對稱加密:密鑰只有?個,加密解密為同?個密碼,且加解密速度快,典型的對稱加密
算法有DES、AES等;
非對稱加密:密鑰成對出現(xiàn)(且根據(jù)公鑰無法推知私鑰,根據(jù)私鑰也無法推知公鑰),
加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對對稱
加密速度比較慢,典型的非對稱加密算法有RSA、DSA等。
http格式結(jié)構(gòu)
分為請求頭,請求行,請求體,也有空行在請求頭和請求體中間

請求行有請求方法(get,post等),URL字段,還有http協(xié)議版本
請求頭有關(guān)鍵字和值組成。常見的有Host:請求的主機名,User-Agent:產(chǎn)生請求的瀏覽器類型,Accept:客戶端可識別的內(nèi)容類型列表。
http1.0 1.1 2.0
| 版本 | 特性 |
|---|---|
| http1.0 | 默認使用短連接的方式(一次請求就建立一個tcp連接,請求完斷開),也可以設置keep-alive來換成長連接,如果一個網(wǎng)頁有多個圖像資源,那么就會申請多個tcp連接,就會浪費資源 。支持get,post,head請求 |
| http1.1 | 默認使用長連接的方式(一個tcp連接可以多次請求,在一定時間內(nèi)保持連接)也可以設置成短連接。新增了五種請求類型。請求頭部增加了host字段,請求消息和響應消息都支持host頭域,如果沒傳還會返回一個錯誤狀態(tài)碼。新增了多個狀態(tài)碼 |
| http2.0 | 多路復用(一個tcp連接可以處理多個請求),同時以前是基于文本解析,現(xiàn)在基于二進制解析,錯誤更少,更高效了。對header壓縮,數(shù)據(jù)更少,傳輸速度快 |
網(wǎng)絡狀態(tài)碼
| 狀態(tài)碼 | 意思 |
|---|---|
| 1xx (信息性狀態(tài)碼) | 接收的請求正在處理 |
| 2xx (成功狀態(tài)碼) | 請求正常處理完畢 |
| 3xx (重定向狀態(tài)碼) | 需要進行附加操作以完成請求 |
| 4xx (客戶端錯誤狀態(tài)碼) | 客戶端無法處理請求 |
| 5xx (服務器錯誤狀態(tài)碼) | 服務器處理請求出錯 |
get和post的區(qū)別
- get花費一個tcp數(shù)據(jù)包,post花費兩個tcp數(shù)據(jù)包,速度get會快一點。
- get會把請求參數(shù)放到url上,post則是放到請求體中,這樣子get就不安全,同時url長度有限制,所以get傳輸數(shù)據(jù)比較小
- get可以被當做書簽被瀏覽器緩存,post不可以
WebSocket
WebSocket是應用層的協(xié)議,他是全雙工通信,同時在連接上與http的短連接不同,用的是長連接。一旦連接上了,就直接在建立的一個tcp上發(fā)送多次請求,不用重復連接。