計算機網絡面試總結
TCP&UDP
TCP(Transmission Control Protocol,傳輸控制協議)是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。 一個TCP連接必須要經過三次“對話”才能建立起來。
- 主機A向主機B發出連接請求數據包:“我想給你發數據,可以嗎?”,這是第一次對話;
- 主機B向主機A發送同意連接和要求同步 (同步就是兩台主機一個在發送,一個在接收,協調工作)的數據包 :“可以,你什么時候發?”,這是第二次對話;
- 主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接着吧!”, 這是第三次對話。
三次“對話”的目的是使數據包的發送和接收同步, 經過三次“對話”之后,主機A才向主機B正式發送數據。
三次握手
- 主機A通過向主機B發送一個含有同步序列號(SYN)的標志位的數據段,向B請求建立連接,通過這個數據段, A告訴B兩件事:我想要和你通信;你可以用這個序列號作為起始數據段來回應我。
- B收到A的請求后,用一個帶有確認應答(ACK)和同步序列號(SYN)標志位的數據段響應A,也告訴A兩件事:我已收到請求了,你可以傳輸數據了;你要用這個序列號作為起始數據段來回應我。
- A收到這個數據段后,再發送一個確認應答(ACK),確認已收到B的數據段:已收到回復,現在要開始傳輸實際數據了,這樣3次握手就完成了,主機A和主機B就可以傳輸數據了。
沒有應用層的數據,SYN這個標志位只有在TCP建立連接時才會被置1,握手完成后SYN標志位被置0。
四次揮手
- 當A完成數據傳輸后,將控制位FIN置1,提出停止TCP連接的請求;
- B收到FIN后對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1;
- 由B端再提出反方向的關閉請求,將FIN置1;
- A對B的請求進行確認,將ACK置1,雙方向的關閉結束。
由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式, 大大提高了數據通信的可靠性,使發送數據端和接收端在數據正式傳輸前就有了交互, 為數據正式傳輸打下了可靠的基礎。
- ACK 是 TCP 報頭的控制位之一,對數據進行確認。確認由目的端發出, 用它來告訴發送端這個序列號之前的數據段都收到了。只有當 ACK=1 時,確認號才有效,當ACK=0時,確認號無效,這時會要求重傳數據,保證數據的完整性。
- SYN 同步序列號,TCP 建立連接時將這個位置 1。
- FIN 發送端完成發送任務位,當 TCP 完成數據傳輸需要斷開時,提出斷開連接的一方將這位置1。
UDP 與 TCP 對比
- TCP 面向連接,需要三次握手,四次揮手。UDP 是無連接的,即發送數據之前不需要建立連接,直接丟過去。
- TCP 提供可靠的服務,通過 TCP 連接傳送的數據,無差錯、不丟失、不重復,且按序到達。UDP 盡最大努力交付,即不保證可靠交付。
- TCP 面向字節流,實際上是 TCP 把數據看成一連串無結構的字節流。UDP 是面向報文的,UDP 沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如 IP 電話,實時視頻會議等)。
- 每一條 TCP 連接只能是點到點的,UDP 支持一對一,一對多,多對一和多對多的交互通信。
- TCP 首部開銷20字節,UDP 的首部開銷小,只有8個字節。
- TCP 的邏輯通信信道是全雙工的可靠信道,UDP 則是不可靠信道。
UDP 的應用場景
UDP 不屬於連接型協議,因而具有資源消耗小,處理速度快的優點,所以通常音頻、視頻和普通數據在傳送時使用UDP 較多,因為它們即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。比如我們聊天用的 QQ 就是使用的UDP 協議,直播中也可以用 UDP。
QQ 並不是端對端的聊天軟件,是得經過服務器轉發消息的,通過 QQ 聊天,數據是 A 發到服務器,服務器再轉發到 B。
每一個 QQ 客戶端之間的交互,實際上都是和服務器交互,再由服務器轉發給正在通信的用戶。
如果每一個 QQ 用戶從一上線到下線的這段時間全部采用 TCP 長連接,對服務器的負擔很大;而如果采用 TCP 短連接,頻繁的連接斷開也會造成網絡負擔。而采用 UDP 則可以避開上述麻煩,減少服務器的負擔。
登陸成功之后,QQ 都會有一個 TCP 連接來保持在線狀態。QQ 采用的通信協議以 UDP 為主,輔以 TCP 協議。QQ 的服務器要同時容納十幾萬的並發連接,因此服務器端只有采用 UDP 協議與客戶端進行通訊才能保證這種超大規模的服務。
QQ 客戶端之間的消息傳送也采用了 UDP 模式,因為國內的網絡環境非常復雜,而且很多用戶采用的方式是通過代理服務器共享一條線路上網的方式,在這些復雜的情況下,客戶端之間能彼此建立起來 TCP 連接的概率較小,嚴重影響傳送信息的效率。而UDP 包能夠穿透大部分的代理服務器,因此 QQ 選擇了 UDP 作為客戶之間的主要通信協議。采用 UDP 協議,通過服務器中轉方式。因此,現在的 IP 偵探在你僅僅跟對方發送聊天消息的時候是無法獲取到IP的。
大家都知道,UDP 協議是不可靠協議,它只管發送,不管對方是否收到的,但它的傳輸很高效。但是作為聊天軟件,怎么可以采用這樣的不可靠方式來傳輸消息呢?於是,騰訊采用了上層協議來保證可靠傳輸:如果客戶端使用 UDP 協議發出消息后,服務器收到該包,需要使用 UDP 協議發回一個應答包,如此來保證消息可以無遺漏傳輸。之所以會發生在客戶端明明看到"消息發送失敗"但對方又收到了這個消息的情況,就是因為客戶端發出的消息服務器已經收到並轉發成功,但客戶端由於網絡原因沒有收到服務器的應答包引起的。
Telegram 端對端加密
端到端加密是一種目前比較安全的通信系統。在這個系統中,只有參與通信的雙方用戶可以讀取通信數據。
如何實現UDP保證有序傳輸
- 發送:包的分片、包確認、包的重發
- 接收:包的調序、包的序號確認
建立緩沖區,由一個線程專門接受數據並且重排,但是這個是在UDP的基礎上自己實現部分簡單的TCP。即收到數據包檢查無誤后返回一個應答。如果發送端在一定時間內沒有收到應答,就自動重發。
目前已有如下開源程序利用 UDP 實現了可靠的數據傳輸,分別為:RUDP、RTP、UDT
在瀏覽器中輸入網址
- 查找域名對應的IP地址。這一步會依次查找瀏覽器緩存,系統緩存,路由器緩存,ISPDNS緩存,根域名服務器
- 瀏覽器向IP對應的web服務器發送一個HTTP請求
- 服務器響應請求,發回網頁內容
- 瀏覽器解析網頁內容
OSI七層模型

TCP/IP四層模型

-
主機到網絡層
實際上TCP/IP參考模型沒有真正描述這一層的實現,只是要求能夠提供給其上層-網絡互連層一個訪問接口,以便在其上傳遞IP分組。由於這一層次未被定義,所以其具體的實現方法將隨着網絡類型的不同而不同。 -
網絡互連層
網絡互連層是整個TCP/IP協議棧的核心。它的功能是把分組發往目標網絡或主機。同時,為了盡快地發送分組,可能需要沿不同的路徑同時進行分組傳遞。因此,分組到達的順序和發送的順序可能不同,這就需要上層必須對分組進行排序。
網絡互連層定義了分組格式和協議,即IP協議(Internet Protocol)。
網絡互連層除了需要完成路由的功能外,也可以完成將不同類型的網絡(異構網)互連的任務。除此之外,網絡互連層還需要完成擁塞控制的功能。 -
傳輸層
在TCP/IP模型中,傳輸層的功能是使源端主機和目標端主機上的對等實體可以進行會話。在傳輸層定義了兩種服務質量不同的協議。即:傳輸控制協議TCP(transmission control protocol)和用戶數據報協議UDP(user datagram protocol)。
TCP協議是一個面向連接的、可靠的協議。它將一台主機發出的字節流無差錯地發往互聯網上的其他主機。在發送端,它負責把上層傳送下來的字節流分成報文段並傳遞給下層。在接收端,它負責把收到的報文進行重組后遞交給上層。TCP協議還要處理端到端的流量控制,以避免緩慢接收的接收方沒有足夠的緩沖區接收發送方發送的大量數據。
UDP協議是一個不可靠的、無連接協議,主要適用於不需要對報文進行排序和流量控制的場合。 -
應用層
TCP/IP模型將OSI參考模型中的會話層和表示層的功能合並到應用層實現。
應用層面向不同的網絡應用引入了不同的應用層協議。其中,有基於TCP協議的,如文件傳輸協議(File Transfer Protocol,FTP)、虛擬終端協議(TELNET)、超文本鏈接協議(Hyper Text Transfer Protocol,HTTP),也有基於UDP協議的。應用層面向不同的網絡應用引入了不同的應用層協議。其中,有基於TCP協議的,如文件傳輸協議(File Transfer Protocol,FTP)、虛擬終端協議(TELNET)、超文本鏈接協議(Hyper Text Transfer Protocol,HTTP),也有基於UDP協議的。
上層屏蔽下層細節,只使用其提供的服務。高內聚低耦合,每一層專注於其功能,各層之間的關系依賴不大。
擁塞控制
如果網絡出現擁塞,分組將會丟失,此時發送方會繼續重傳,從而導致網絡擁塞程度更高。因此當出現擁塞時,應當控制發送方的速率。這一點和流量控制很像,但是出發點不同。流量控制是為了讓接收方能來得及接收,而擁塞控制是為了降低整個網絡的擁塞程度。
TCP 主要通過四個算法來進行擁塞控制:慢開始、擁塞避免、快重傳、快恢復。
發送方需要維護一個叫做擁塞窗口(cwnd)的狀態變量,注意擁塞窗口與發送方窗口的區別:擁塞窗口只是一個狀態變量,實際決定發送方能發送多少數據的是發送方窗口。
