傳輸層
- 傳輸層的主要工作是定義端口,標識應用程序身份,並將數據包交給對應的應用程序實現端口到端口的通信,並且傳輸層引入了TCP/UDP協議。
1. 如果有大量數據包、數據包大?時間很長,網絡中斷,怎么控制重新傳輸?怎么確保數據包正確完整---傳輸層
- 傳輸層封裝數據包,通過定義的 TCP、UDP 協議實現按序一個一個發送,保證數據完整正確性;
2. QQ發消息,你必須使用QQ接受消息,才可以正常通信;但是電腦中不是只運行了QQ,還有其他程序,怎么確定由誰來處理消息
- 傳輸層定義端口的概念-- HTTP-tcp-80端口、https是tcp的443端口?--交給特定應用處理
TCP協議
- TCP (Transmission Control Protocol)傳輸控制協議,顧名思義,就是要對數據的傳輸進行一定的控制.

上圖為 TCP協議的基本信息
- 源目端口:源端口=本地端口、目的端口=目標主機端口;-----尋找應用的作用
- 序號:TCP 數據包很大的時候,需要分段(比如分為3段),進行三段分開發送;我怎么確認這些碎片的順序,就會用到序號,到達目的主機時需要進行重組,重組后才可以使用這些數據
- 確認號:答復確認消息---比如微信發紅包后不知道對方有沒有收到,需要給我反饋。沒有收到也是一個反饋,收到了就會收到確認消息
- 標志位:
- ACK=1(燈亮-ACK消息-回應消息)、
- FIN=0(燈不亮):(結束連接的包需要把 FIN 置位 1)
- SYN=1 什么類型的包:發起連接請求的包(sym包)、接受請求的包都需要把 SYN 置位 1,FIN=1(結束連接的包需要把 FIN 置位 1)

客戶端 client 和 服務器 server 初始都是關閉狀態
客戶端茫茫人海中看到了服務器,要服務器進行通信,通信之前需要進行連接,連接之前需要通過三次握手來建立連接
一次握手:
- 客戶端要給服務器發起連接,消息內包括:什么類型的消息 SYN=1(亮燈)說明是一個發起連接請求的包請求報文,還會帶一個編號是J(seq=j),服務器收到消息(星寶SYN=1),后服務器狀態會發生改變Sym_REVD,說明我被客戶端給撩了;
二次握手:
- 服務器給客戶端回應,回應要發(安可包)ACK=1(亮燈)SYN =1,會把你的確認號帶着ack=j+1,和服務器自己的序列號seq=k-------后狀態會發生改變Sym_REVD
三次握手:
- 客戶端需要回應服務器,我應經收到了你的消息是確認包:ACK=1(確認包)ack=k+1(基於服務器的標識)------已建立鏈接
三次握手比如:
男生 女生
-------------------> 認識你,交往請求消息
<------------------- 我知道了,我也同意--確認消息
-------------------> 我也知道,開心~~牽手成功! ! ! | 三次揮手建立鏈接之后,就可以發送數據
=========== 建立鏈接之后,經過一段時間,需要斷開鏈接
斷開連接需要 FIN = 1(譯:份包)
- 客戶端告訴服務器我們要分手請求:FIN=1,swq=n
- 服務器回應客戶端可以:回應包ACK=1,序列號seq=n+1
- 服務器也發給客戶端一個分手請求:FIN=1,swq=m
- 客戶端回應服務器拜拜就拜拜:回應包 ACK=1,seq=m+1
- 對不起,我不喜歡你了
- 好的,我知道你不喜歡我了
- 你知道了,那分手吧,再見
- 好吧,分手吧,再也不見
整體流程:
1、TCP 協議 和 UDP 協議的區別?
TCP 協議 和 UDP協議,都是傳輸層的兩個協議,它們的區別主要有一下三個方面來體現:
第一,TCP協議是面向連接的,也就是說向我們在打電話之前一樣,要先建一個撥號連接;
而 UDP協議是面向無連接的,就是說在發送順序之前,UDP不需要建立鏈接;
第二,TCP協議是一個可靠的傳輸協議,它可以保證傳輸的一個正確性,保證我們的不丟包不重復,而且數據是按順序到達的;
而 UDP協議是一個不可靠的協議,它是不保證我們的數據能夠可靠完整的到達,他只是盡最大的努力去完成交付的;
第三,因為 TCP協議的以上兩個特點,所以 TCP協議的傳輸效率會比較低;而對應的 UDP協議傳輸效率會比較高;
如果有一些場景,它注重一個傳輸速度,而不在乎丟包的話,一般會選擇 UDP協議來進行傳輸;比如:ip電話、流媒體等
2、TCP 協議的三次握手過程?
TCP協議 在建立鏈接的時候,需要進行三次握手的過程,
第一次握手,是客戶端向服務器端發起的,這是用來發起一個鏈接建立的請求,那么這個報文中的 SYN 為會被標記為:1,所以我們把它常叫做 SYN包;
第二次握手,是由服務器向客戶端發起的,是來確認服務器的一個請求鏈接的,這個報文中的 ACK位 還有 SYN位都被標記為:1,所以常叫做 SYN-ACK 報文;
第三次握手,是客戶端向服務器發起的,這是歲服務器的上一個報文的一個確認報文,這個報文中的一個 ACK位被標記為:1,所以常叫做 ACK 包;
以上就是 TCP 協議的三次握手的一個過程;
3、TCP 協議的四次揮手過程?
當 TCP協議 完成了數據的發送之后,就會嘗試去斷開鏈接,此時會經歷四次揮手的過程:
第一次揮手:是客戶端向服務器發起的,這個時候客戶端已經完成了數據發送,會發起一個包,去進行一個鏈接斷開的請求,這個報文中的 FIN位 被標記為:1,所以叫做 FIN 包;
第二次揮手:是服務器發送給客戶端的,這個報文是用來確認上一個客戶端用來斷開鏈接請求的一個報文,所以它是一個 ACK 報文;
第三次揮手:是服務器發送給客戶端的,那么這個時候服務的數據,也發送完畢的話,他也會想客戶端發起一個斷開連接的請求,在這個報文中的 FIN位 也被標記為:1,所以是一個 FIN 包;
第四次揮手:是客戶端發送給服務器的,是用來確認服務器的上一個斷開連接的一個請求報文,所以這次揮手也是一個 ACK 報文;
以上就是 TCP 協議四次揮手的一個過程;
4、為什么握手需要三次,揮手卻要四次?
TCP 三次握手的過程是它建立鏈接的過程,建立鏈接我只需要確認客戶端和服務器都在,雙方可以通信就可以了,所以握手需要三次;
但是四次揮手,是 TCP 結束了數據發送要斷開鏈接的時候的一個過程,所以我要確保,我即結束了發送數據,也結束了接受數據,
開始咱們的客戶端結束了數據發送,他回去告知服務器,那這個時候我們的客戶端,其實還是可以接受數據的,服務器收到客戶端結束發送數據的請求之后,客戶端只是會停止去接收數據,
但是此時服務器其實還可以再發送數據的,所以如果服務器它也發送完了,那就需要你想客戶端發送一次,FIN包 來告知客戶端,其實我的數據也發送完了,我也要斷開連接了;
那此時客戶端收到了服務器這個 FIN包之后,那么客戶端也會進行一個確認,此時然后雙方才都會去,關閉發送和接受的一個通道;
所以揮手需要四次
UDP協議
- UDP (User Datagram Protocol)用戶數據報協議。
- UDP 不需要連接---無連接協議 -- 不可靠的協議
- 目的:速度快 --- 但是有些丟包
- 什么場景:
- 視屏、IP電話、流媒體 --- 不在乎丟包,只要不卡
- 什么協議使用 UDP 連接
- VOIP電話、DNS(域名解析協議)、SNMP(簡單網絡管理協議)、DHCP(動態分配地址)

TCP vs UDP
tcp 有很正規的握手和揮手的鏈接過程,所以是面向連接的協議;http 是基於tcp80端口的可靠的應用層協議;tcp 是可靠的 每個包都標了一個記號,這個包丟了還可以進行重傳;如果傳輸數據量比較大時 需要可靠的場景進行傳輸;速度慢沒關系,必須可靠;
udp 是面向非連接的,會丟包,不可靠的;傳輸量小,但是速度很快;要求速度快,丟包了也無所謂;

*******請大家尊重原創,如要轉載,請注明出處:轉載自:https://www.cnblogs.com/shouhu/ 謝謝!!*******
