一篇文章看明白 TCP/IP,TCP,UDP,IP,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 層次化是有好處的。比如,如果互聯網只由一個協議統籌,某個地方需要改變設計時,就必須把所有部分整體替換掉。而分層之後只需把變動的層替換掉即可。把各層之間的介面部分規劃好之後,每個層次內部的設計就能夠自由改動了。
值得一提的是,層次化之後,設計也變得相對簡單了。處於應用層上的應用可以只考慮分派給自己的任務,而不需要弄清對方在地球上哪個地方、對方的傳輸路線是怎樣的、是否能確保傳輸送達等問題。
數據鏈路層
數據鏈路層是負責接收 IP 數據包並通過網路發送,或者從網路上接收物理幀,抽出 IP 數據包,交給 IP 層。
ARP 是正向地址解析協議,通過已知的 IP,尋找對應主機的 MAC 地址。
RARP 是反向地址解析協議,通過 MAC 地址確定 IP 地址。比如無盤工作站還有 DHCP 服務。
常見的介面層協議有: Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等。
網路層
負責相鄰計算機之間的通信。其功能包括三方面。
處理來自傳輸層的分組發送請求,收到請求後,將分組裝入 IP 數據報,填充報頭,選擇去往信宿機的路徑,然後將數據報發往適當的網路介面。
處理輸入數據報:首先檢查其合法性,然後進行尋徑--假如該數據報已到達信宿機,則去掉報頭,將剩下部分交給適當的傳輸協議;假如該數據報尚未到達信宿,則轉發該數據報。
處理路徑、流控、擁塞等問題。
網路層包括: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三次握手的過程如下:
客戶端發送 SYN(SEQ=x)報文給伺服器端,進入 SYN_SEND 狀態。
伺服器端收到 SYN 報文,回應一個 SYN (SEQ=y)ACK(ACK=x+1)報文,進入 SYN_RECV 狀態。
客戶端收到伺服器端的 SYN 報文,回應一個 ACK(ACK=y+1)報文,進入 Established 狀態。
三次握手完成,TCP客戶端和伺服器端成功地建立連接,可以開始傳輸數據了。
連接終止
建立一個連接需要三次握手,而終止一個連接要經過四次握手,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示。
某個應用進程首先調用 close,稱該端執行「主動關閉」(active close)。該端的 TCP 於是發送一個 FIN 分節,表示數據發送完畢。
接收到這個 FIN 的對端執行 「被動關閉」(passive close),這個 FIN 由 TCP 確認。
注意:FIN 的接收也作為一個文件結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其他數據之後,因為,FIN 的接收意味著接收端應用進程在相應連接上再無額外數據可接收。
一段時間後,接收到這個文件結束符的應用進程將調用 close 關閉它的套接字。這導致它的 TCP 也發送一個 FIN。
接收這個最終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 通訊示例
在 TCP/IP 通訊過程中,每個分層,都會對所發送的數據附加一個首部,在這個首部中包含了該層必要的信息,如發送端的目標地址一節協議相關信息。通常,為協議提供的信息為包首部,所要發送的內容為數據。在下一層角度看,從上一層收到的包全部被認為是本層的數據。
假設甲給乙發送郵件,內容為:「早上好」。而從 TCP/IP 通信上看,是從一台計算機 A 向另一台計算機 B 發送郵件。我們通過這個例子來講解一下 TCP/IP 通信的過程。
數據包的發送處理
應用程序處理
啟動應用程序新建郵件,將收件人郵箱填好,再由鍵盤輸入「早上好」,滑鼠點擊「發送」按鈕就可以開始 TCP/IP 的通信了。
首先,應用程序會對郵件內容進行編碼處理,例如:UTF-8,GB2312 等。這些編碼相當於 OSI 的表示層功能。應用在發送郵件的那一刻建立 TCP 連接,從而利用這個 TCP 連接發送數據。它的過程首先是將應用的數據發送給下一層的 TCP,在做實際的轉發處理。
TCP 模塊處理
TCP根據應用的提示,負責建立連接,發送數據以及斷開連接。TCP 提供將應用層發來的數據順利發送至對端的可靠傳輸。
為了實現 TCP 的這一功能,需要在應用層數據的前端附加一個 TCP 的首部。TCP 的首部中包括源埠號和目標埠號、序號。隨後將附加了 TCP 首部的包再發送給 IP。
IP 模塊處理
IP 將 TCP 傳過來的 TCP 首部和 TCP 數據合起來當做自己的數據,並在 TCP 首部的前端奸商自己的 IP 首部。IP 首部中包含接收端 IP 地址,發送端 IP 地址。隨後 IP 包將被發送給連接這些路由器或主機網路介面的驅動程序,以實現真正的發送數據。
網路介面(乙太網驅動)的處理
從 IP 傳過來的 IP 包,對於乙太網卡來說就是數據。給這些數據附加上乙太網首部並進行發送處理。乙太網首部中包含接收端 MAC 地址,發送端 MAC 地址,乙太網類型,乙太網數據協議。根據上述信息產生的乙太網數據將被通過物理層傳輸給接收端。
數據包的接收處理
網路介面(乙太網驅動)的處理
主機收到乙太網包以後,首先從乙太網的包首部找到 MAC 地址判斷是否為發給自己的包。如果不是發給自己的則丟棄數據,如果是發給自己的則將數據傳給處理 IP 的子程序。
IP 模塊處理
IP 模塊收到 IP 包首部以及後面的數據部分以後,也做類似的處理。如果判斷得出包首部的 IP 地址與自己的 IP 地址匹配,則可接受數據並從中查找上一層的協議。並將後面的數據傳給 TCP 或者 UDP 處理。對於有路由的情況下,接收端的地址往往不是自己的地址,此時需要藉助路由控制表,從中找出應該送到的主機或者路由器以後再進行轉發數據。
TCP 模塊處理
在 TCP 模塊中,首先會校驗數據是否被破壞,然後檢查是否在按照序號接收數據。最後檢查埠號,確定具體的應用程序。數據接收完畢後,接收端則發送一個「確認繪製」給發送端。數據被完整地接收以後,會傳給由埠號識別的應用程序。
應用程序處理
接收端應用程序會直接接收發送端發送的數據。通過解析數據可以獲知郵件的內容信息。
參考資料
《圖解HTTP》、《圖解TCP/IP》、百度百科


※一篇文章學會使用 Android IPC 多進程
※一張圖看明白 Android Handler 消息機制
TAG:Jeanboy |