1. 程式人生 > >帶你瞭解TCP/IP,UDP,Socket之間關係

帶你瞭解TCP/IP,UDP,Socket之間關係

概述

  • 什麼是 TCP/IP?
  • TCP,UDP 有什麼區別?
  • 什麼是 Socket?

網上這方面的資料有很多,但都很瑣碎,沒有系統化,要麼看完很快就忘記了,要麼就是看完迷迷糊糊似懂非懂,下面我們來一一攻破以上問題。

什麼是 TCP/IP ?

計算機與網路裝置要相互通訊,雙方就必須基於相同的方法。比如,如何探測到通訊目標、由哪一邊先發起通訊、使用哪種語言進行通訊、怎樣結束通訊等規則都需要事先確定。不同的硬體、作業系統之間的通訊,所有的這一切都需要一種規則。而我們就把這種規則稱為協議(protocol)。

TCP/IP 是網際網路相關的各類協議族的總稱,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都屬於 TCP/IP 族內的協議。像這樣把與網際網路相關聯的協議集合起來總稱為 TCP/IP。也有說法認為,TCP/IP 是指 TCP 和 IP 這兩種協議。還有一種說法認為,TCP/IP 是在 IP 協議的通訊過程中,使用到的協議族的統稱。

個人認為,因為 TCP/IP 族內的協議有很多,為了突出 TCP 與 IP 這兩個協議的重要性,所以就用 TCP/IP 來表示 TCP/IP 協議族了。

網路參考模型

  • OSI 參考模型

OSI 參考模型是 ISO 的建議,它是為了使各層上的協議國際標準化而發展起來的。OSI 參考模型全稱是開放系統互連參考模型(Open System Interconnection Reference Model)。這一參考模型共分為七層:物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。

  • TCP/IP 參考模型

TCP/IP 參考模型是首先由 ARPANET 所使用的網路體系結構。這個體系結構在它的兩個主要協議出現以後被稱為 TCP/IP 參考模型(TCP/IP Reference Model)。這一網路協議共分為四層:資料鏈路層、網路層、傳輸層和應用層。

TCP/IP 的分層管理

TCP/IP 協議族裡重要的一點就是分層。把 TCP/IP 層次化是有好處的。比如,如果網際網路只由一個協議統籌,某個地方需要改變設計時,就必須把所有部分整體替換掉。而分層之後只需把變動的層替換掉即可。把各層之間的介面部分規劃好之後,每個層次內部的設計就能夠自由改動了。

值得一提的是,層次化之後,設計也變得相對簡單了。處於應用層上的應用可以只考慮分派給自己的任務,而不需要弄清對方在地球上哪個地方、對方的傳輸路線是怎樣的、是否能確保傳輸送達等問題。

OSI中的層 功能 TCP/IP協議族
7 應用層 檔案傳輸,電子郵件,檔案服務,虛擬終端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
6 表示層 資料格式化,程式碼轉換,資料加密 沒有協議
5 會話層 解除或建立與別的接點的聯絡 沒有協議
4 傳輸層 提供端對端的介面 TCP,UDP
3 網路層 為資料包選擇路由 IP,ICMP,OSPF,EIGRP,IGMP
2 資料鏈路層 傳輸有地址的幀以及錯誤檢測功能 SLIP,CSLIP,PPP,MTU
1 物理層 以二進位制資料形式在物理媒體上傳輸資料 ISO2110,IEEE802,IEEE802.2

- 資料鏈路層

資料鏈路層是負責接收 IP 資料包並通過網路傳送,或者從網路上接收物理幀,抽出 IP 資料包,交給 IP 層。

ARP 是正向地址解析協議,通過已知的 IP,尋找對應主機的 MAC 地址。

RARP 是反向地址解析協議,通過 MAC 地址確定 IP 地址。比如無盤工作站還有 DHCP 服務。

常見的介面層協議有:
Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等。

  • 網路層

負責相鄰計算機之間的通訊。其功能包括三方面。

  1. 處理來自傳輸層的分組傳送請求,收到請求後,將分組裝入 IP 資料報,填充報頭,選擇去往信宿機的路徑,然後將資料報發往適當的網路介面。
  2. 處理輸入資料報:首先檢查其合法性,然後進行尋徑–假如該資料報已到達信宿機,則去掉報頭,將剩下部分交給適當的傳輸協議;假如該資料報尚未到達信宿,則轉發該資料報。
  3. 處理路徑、流控、擁塞等問題。

網路層包括:IP(Internet Protocol) 協議、ICMP(Internet Control Message Protocol)

控制報文協議、ARP(Address Resolution Protocol) 地址轉換協議、RARP(Reverse ARP) 反向地址轉換協議。

IP 是網路層的核心,通過路由選擇將下一條IP封裝後交給介面層。IP資料報是無連線服務。

ICMP 是網路層的補充,可以回送報文。用來檢測網路是否通暢。

Ping 命令就是傳送 ICMP 的 echo 包,通過回送的 echo relay 進行網路測試。

  • 傳輸層

提供應用程式間的通訊。其功能包括:一、格式化資訊流;二、提供可靠傳輸。為實現後者,傳輸層協議規定接收端必須發回確認,並且假如分組丟失,必須重新發送,即耳熟能詳的“三次握手”過程,從而提供可靠的資料傳輸。

傳輸層協議主要是:傳輸控制協議 TCP(Transmission Control Protocol) 和使用者資料報協議 UDP(User Datagram protocol)。

  • 應用層

向用戶提供一組常用的應用程式,比如電子郵件、檔案傳輸訪問、遠端登入等。遠端登入 TELNET 使用 TELNET 協議提供在網路其它主機上註冊的介面。TELNET 會話提供了基於字元的虛擬終端。檔案傳輸訪問 FTP 使用 FTP 協議來提供網路內機器間的檔案拷貝功能。

應用層協議主要包括如下幾個:FTP、TELNET、DNS、SMTP、NFS、HTTP。

FTP(File Transfer Protocol)是檔案傳輸協議,一般上傳下載用FTP服務,資料埠是 20H,控制埠是 21H。

Telnet 服務是使用者遠端登入服務,使用 23H 埠,使用明碼傳送,保密性差、簡單方便。

DNS(Domain Name Service)是域名解析服務,提供域名到 IP 地址之間的轉換,使用埠 53。

SMTP(Simple Mail Transfer Protocol)是簡單郵件傳輸協議,用來控制信件的傳送、中轉,使用埠 25。

NFS(Network File System)是網路檔案系統,用於網路中不同主機間的檔案共享。

HTTP(Hypertext Transfer Protocol)是超文字傳輸協議,用於實現網際網路中的 WWW 服務,使用埠 80。

什麼是 TCP ?

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,由 IETF 的RFC 793定義。TCP 是面向連線的、可靠的流協議。流就是指不間斷的資料結構,你可以把它想象成排水管中的水流。TCP 為了保證報文傳輸的可靠,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的位元組發回一個相應的確認(ACK);如果傳送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的資料(假設丟失了)將會被重傳。

  • 連線建立

TCP是因特網中的傳輸層協議,使用三次握手協議建立連線。當主動方發出SYN連線請求後,等待對方回答 SYN + ACK ,並最終對對方的 SYN 執行 ACK 確認。這種建立連線的方法可以防止產生錯誤的連線,TCP 使用的流量控制協議是可變大小的滑動視窗協議。

TCP三次握手的過程如下:

  1. 客戶端傳送 SYN(SEQ=x)報文給伺服器端,進入 SYN_SEND 狀態。
  2. 伺服器端收到 SYN 報文,迴應一個 SYN (SEQ=y)ACK(ACK=x+1)報文,進入 SYN_RECV 狀態。
  3. 客戶端收到伺服器端的 SYN 報文,迴應一個 ACK(ACK=y+1)報文,進入 Established 狀態。

三次握手完成,TCP客戶端和伺服器端成功地建立連線,可以開始傳輸資料了。

  • 連線終止

建立一個連線需要三次握手,而終止一個連線要經過四次握手,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示。

  1. 某個應用程序首先呼叫 close,稱該端執行“主動關閉”(active close)。該端的 TCP 於是傳送一個 FIN 分節,表示資料傳送完畢。
  2. 接收到這個 FIN 的對端執行 “被動關閉”(passive close),這個 FIN 由 TCP 確認。

    注意:FIN 的接收也作為一個檔案結束符(end-of-file)傳遞給接收端應用程序,放在已排隊等候該應用程序接收的任何其他資料之後,因為,FIN 的接收意味著接收端應用程序在相應連線上再無額外資料可接收。

  3. 一段時間後,接收到這個檔案結束符的應用程序將呼叫 close 關閉它的套接字。這導致它的 TCP 也傳送一個 FIN。
  4. 接收這個最終FIN的原發送端 TCP(即執行主動關閉的那一端)確認這個 FIN。
    既然每個方向都需要一個 FIN 和一個 ACK,因此通常需要4個分節。

無論是客戶還是伺服器,任何一端都可以執行主動關閉。通常情況是,客戶執行主動關閉,但是某些協議,例如,HTTP/1.0卻由伺服器執行主動關閉。

什麼是 UDP ?

UDP 是 User Datagram Protocol 的簡稱, 中文名是使用者資料報協議,是 OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,IETF RFC 768 是 UDP 的正式規範。UDP 在 IP 報文的協議號是17。 UDP 協議全稱是使用者資料報協議,在網路中它與 TCP 協議一樣用於處理資料包,是一種無連線的協議。UDP 有不提供資料包分組、組裝和不能對資料包進行排序的缺點,也就是說,當報文傳送之後,是無法得知其是否安全完整到達的。UDP 用來支援那些需要在計算機之間傳輸資料的網路應用。包括網路視訊會議系統在內的眾多的客戶/伺服器模式的網路應用都需要使用 UDP 協議。 UDP 是不具有可靠性的資料報協議。細微的處理他會交給上層的應用去完成。在 UDP 的情況下,雖然可以確保傳送訊息的大小,確不能保證訊息一定會到達。因此應用有時會根據自己的需要進行重發處理。

TCP 與 UDP 的區別

TCP 用於在傳輸層有必要實現可靠傳輸的情況。由於它是面向有連結並具備順序控制、重發控制等機制的,所以他可以為應用提供可靠的傳輸。 而在一方面,UDP 主要用於那些對高速傳輸和實時性有較高要求的通訊或廣播通訊。 我們舉一個通過 IP 電話進行通話的例子。如果使用 TCP,資料在傳送途中如果丟失會被重發,但這樣無法流暢的傳輸通話人的聲音,會導致無法進行正常交流。而採用 UDP,他不會進行重發處理。從而也就不會有聲音大幅度延遲到達的問題。即使有部分資料丟失,也支援會影響某一小部分的通話。此外,在多播與廣播通訊中也是用 UDP 而不是 TCP。

什麼是 IP ?

網路之間互連的協議(IP)是 Internet Protocol 的外語縮寫,IP 是在 TCP/IP 協議中網路層的主要協議,任務是僅僅根據源主機和目的主機的地址傳送資料。為此目的,IP 定義了定址方法和資料報的封裝結構。第一個架構的主要版本,現在稱為 IPv4,仍然是最主要的網際網路協議,儘管世界各地正在積極部署 IPv6。 IP 協議的作用是把各種資料包傳送給對方。而要保證確實傳送到對方那裡,則需要滿足各類條件。其中兩個重要的條件是 IP 地址和 MAC地址(Media Access Control Address)。 IP 地址指明瞭節點被分配到的地址,MAC 地址是指網絡卡所屬的固定地址。IP 地址可以和 MAC 地址進行配對。IP 地址可變換,但 MAC地址基本上不會更改。

什麼是 Socket ?

應用在使用 TCP 或 UDP 時,會用到作業系統提供的類庫。這種類庫一般被稱為 API(Application Programming Interface,應用程式設計介面)。 使用 TCP 或 UDP 通訊時,優惠廣泛使用到套接字(Socket)的 API。套接字原本是由 BSD UNIX 開發的,但是後被移植到了 Windows 的 Winsock 以及嵌入式作業系統中。 應用程式利用套接字,可以設定對端的 IP 地址,埠號,並實現資料的傳送與接收。 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個 Socket。 建立網路通訊連線至少要一對埠號(Socket)。Socket 本質是程式設計介面(API),對 TCP/IP 的封裝,TCP/IP 也要提供可供程式設計師做網路開發所用的介面,這就是 Socket 程式設計介面;HTTP 是轎車,提供了封裝或者顯示資料的具體形式;Socket 是發動機,提供了網路通訊的能力。

TCP/IP 通訊示例

![](https://i.imgur.com/EEIQzmy.jpg) 在 TCP/IP 通訊過程中,每個分層,都會對所傳送的資料附加一個首部,在這個首部中包含了該層必要的資訊,如傳送端的目標地址一節協議相關資訊。通常,為協議提供的資訊為包首部,所要傳送的內容為資料。在下一層角度看,從上一層收到的包全部被認為是本層的資料。 假設甲給乙傳送郵件,內容為:“早上好”。而從 TCP/IP 通訊上看,是從一臺計算機 A 向另一臺計算機 B 傳送郵件。我們通過這個例子來講解一下 TCP/IP 通訊的過程。
  • 資料包的傳送處理

    1. 應用程式處理
啟動應用程式新建郵件,將收件人郵箱填好,再由鍵盤輸入“早上好”,滑鼠點選“傳送”按鈕就可以開始 TCP/IP 的通訊了。 首先,應用程式會對郵件內容進行編碼處理,例如:UTF-8,GB2312 等。這些編碼相當於 OSI 的表示層功能。應用在傳送郵件的那一刻建立 TCP 連線,從而利用這個 TCP 連線傳送資料。它的過程首先是將應用的資料傳送給下一層的 TCP,在做實際的轉發處理。
  1. TCP 模組處理

TCP根據應用的提示,負責建立連線,傳送資料以及斷開連線。TCP 提供將應用層發來的資料順利傳送至對端的可靠傳輸。

為了實現 TCP 的這一功能,需要在應用層資料的前端附加一個 TCP 的首部。TCP 的首部中包括源埠號和目標埠號、序號。隨後將附加了 TCP 首部的包再發送給 IP。

  1. IP 模組處理

IP 將 TCP 傳過來的 TCP 首部和 TCP 資料合起來當做自己的資料,並在 TCP 首部的前端奸商自己的 IP 首部。IP 首部中包含接收端 IP 地址,傳送端 IP 地址。隨後 IP 包將被髮送給連線這些路由器或主機網路介面的驅動程式,以實現真正的傳送資料。

  1. 網路介面(乙太網驅動)的處理

從 IP 傳過來的 IP 包,對於乙太網卡來說就是資料。給這些資料附加上乙太網首部並進行傳送處理。乙太網首部中包含接收端 MAC 地址,傳送端 MAC 地址,乙太網型別,乙太網資料協議。根據上述資訊產生的乙太網資料將被通過物理層傳輸給接收端。

  • 資料包的接收處理

    1. 網路介面(乙太網驅動)的處理

主機收到乙太網包以後,首先從乙太網的包首部找到 MAC 地址判斷是否為發給自己的包。如果不是發給自己的則丟棄資料,如果是發給自己的則將資料傳給處理 IP 的子程式。

  1. IP 模組處理

IP 模組收到 IP 包首部以及後面的資料部分以後,也做類似的處理。如果判斷得出包首部的 IP 地址與自己的 IP 地址匹配,則可接受資料並從中查詢上一層的協議。並將後面的資料傳給 TCP 或者 UDP 處理。對於有路由的情況下,接收端的地址往往不是自己的地址,此時需要藉助路由控制表,從中找出應該送到的主機或者路由器以後再進行轉發資料。

  1. TCP 模組處理

在 TCP 模組中,首先會校驗資料是否被破壞,然後檢查是否在按照序號接收資料。最後檢查埠號,確定具體的應用程式。資料接收完畢後,接收端則傳送一個“確認繪製”給傳送端。資料被完整地接收以後,會傳給由埠號識別的應用程式。

  1. 應用程式處理

接收端應用程式會直接接收發送端傳送的資料。通過解析資料可以獲知郵件的內容資訊。