TCP、UDP基礎(chǔ)知識
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)協(xié)議屬于傳輸層協(xié)議。其中TCP提供IP環(huán)境下的數(shù)據(jù)可靠傳輸,它提供的服務(wù)包括數(shù)據(jù)流傳送,可靠性、有效流控、全雙工操作和多路復(fù)用。通過面向連接、端到端和可靠的數(shù)據(jù)包發(fā)送。通俗說,它是事先為所發(fā)送的數(shù)據(jù)開辟出連接好的通道,然后再進行數(shù)據(jù)發(fā)送;而UDP對應(yīng)的則是可靠性要求低,傳輸經(jīng)濟的應(yīng)用。TCP支持的應(yīng)用層協(xié)議主要有:Telnet、FTP、SMTP等;UDP支持的應(yīng)用層協(xié)議主要有:NFS(網(wǎng)絡(luò)文件系統(tǒng))、SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)、DNS(主域名稱系統(tǒng))、TFTP(通用文件傳輸協(xié)議)等。
面向連接的TCP
"面向連接"就是在正式通信前必須與對方建立連接。TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說,在正式收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接。一個TCP連接必須要經(jīng)過三次"對話"才能建立起來。
TCP連接的三次握手:
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入SYN_SEND狀態(tài),等待服務(wù)器確認;
第二次握手:服務(wù)器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED狀態(tài),完成三次握手。
握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。
注:SYN表示建立連接,F(xiàn)IN表示關(guān)閉連接,ACK表示響應(yīng),PSH表示有DATA數(shù)據(jù)傳輸,RST表示連接重置。
斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開TCP連接的請求,斷開過程需要經(jīng)過“四次握手”。
面向非連接的UDP
"面向非連接"就是在正式通信前不必與對方先建立連接,不管對方狀態(tài)就直接發(fā)送。UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議)是與TCP相對應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過來。UDP適用于一次只傳少量數(shù)據(jù),對可靠性要求不高的應(yīng)用環(huán)境。比如,經(jīng)常使用"ping"命令來測試兩臺主機之間TCP/IP通信是否正常,其實"ping"命令的原理就是向?qū)Ψ街鳈C發(fā)送UDP數(shù)據(jù)包,然后對方主機確認收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達的消息及時反饋回來,那么網(wǎng)絡(luò)就是通的。
TCP與UDP區(qū)別:
- TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接。
- TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達;UDP盡最大努力交付,即不保證可靠的交付。TCP通過校驗和,重傳控制,序號標識,滑動窗口,確認應(yīng)答實現(xiàn)可靠傳輸。
- TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報文的,UDP沒有擁塞控制,具有較好的實時性,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機的發(fā)送速率降低,適用于高速傳輸和實時性具有較高的通信或廣播通信(如IP電話,實時視頻會議等)。
- 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信。
- TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個字節(jié)。也就是說TCP對系統(tǒng)資源要求較多,UDP對系統(tǒng)要求較少。
- TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道。
| 參考項 | TCP | UDP |
|---|---|---|
| 連接 | 面向連接 | 面向非連接 |
| 傳輸可靠性 | 可靠 | 不可靠 |
| 應(yīng)用場景 | 傳輸大量數(shù)據(jù) | 少量數(shù)據(jù) |
| 速度 | 慢 | 快 |
其他知識點補充
TCP、UDP和HTTP的關(guān)系
-
TCP/IP是個協(xié)議組,可分為三個層次:網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。
在網(wǎng)絡(luò)層有IP協(xié)議、ICMP協(xié)議、ARP協(xié)議、RARP協(xié)議和BOOTP協(xié)議。
在傳輸層中有TCP協(xié)議與UDP協(xié)議。在應(yīng)用層有FTP、HTTP、TELNET、SMTP、DNS等協(xié)議。
因此,HTTP本身就是一個協(xié)議(超文本傳輸協(xié)議),是從Web服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。
HTTP協(xié)議是建立在請求/響應(yīng)模型上的。
首先由客戶建立一條與服務(wù)器的TCP鏈接,并發(fā)送一個請求到服務(wù)器,請求中包含請求方法、URI、協(xié)議版本以及相關(guān)的MIME樣式的消息。服務(wù)器響應(yīng)一個狀態(tài)行,包含消息的協(xié)議版本、一個成功和失敗碼以及相關(guān)的MIME式樣的消息。HTTP/1.0為每一次HTTP的請求/響應(yīng)建立一條新的TCP鏈接,因此一個包含HTML內(nèi)容和圖片的頁面將需要建立多次的短期的TCP鏈接。一次TCP鏈接的建立將需要3次握手。另外,為了獲得適當(dāng)?shù)膫鬏斔俣龋瑒t需要TCP花費額外的回路鏈接時間(RTT)。每一次鏈接的建立需要這種經(jīng)常性的開銷,而其并不帶有實際有用的數(shù)據(jù),只是保證鏈接的可靠性,因此HTTP/1.1提出了可持續(xù)鏈接的實現(xiàn)方法。HTTP/1.1將只建立一次TCP的鏈接而重復(fù)地使用它傳輸一系列的請求/響應(yīng)消息,因此減少了鏈接建立的次數(shù)和經(jīng)常性的鏈接開銷。
HTTP本身是一個協(xié)議,但其最終還是基于TCP的。
SOCKET:TCP/IP網(wǎng)絡(luò)的API。
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計模式中,Socket其實就是一個門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
Socket 接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,用以開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。

TCP、UDP、HTTP、SOCKET之間的認識
網(wǎng)絡(luò)由下往上分為物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層和應(yīng)用層。
IP 協(xié)議對應(yīng)于網(wǎng)絡(luò)層,TCP協(xié)議對應(yīng)于傳輸層,HTTP協(xié)議對應(yīng)于應(yīng)用層,三者從本質(zhì)上來說沒有可比性,socket則是TCP/IP網(wǎng)絡(luò)的API,是對TCP/IP協(xié)議的封裝和應(yīng)用。
可以說,TCP/IP代表傳輸控制協(xié)議/網(wǎng)際協(xié)議,指的是一系列協(xié)議。主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸,而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。
socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API),通過Socket,我們才能使用TCP/IP協(xié)議。實際上,Socket跟TCP/IP協(xié)議沒有必然的聯(lián)系。Socket編程接口在設(shè)計的時候,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議。所以說,Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口,比如create、 listen、connect、accept、send、read和write等等。
實際上,傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的,而Socket本身不算是協(xié)議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口。
TCP和UDP使用IP協(xié)議從一個網(wǎng)絡(luò)傳送數(shù)據(jù)包到另一個網(wǎng)絡(luò)。把IP想像成一種高速公路,它允許其它協(xié)議在上面行駛并找到到其它電腦的出口。
TCP和UDP是高速公路上的“卡車”,它們攜帶的貨物就是像HTTP,文件傳輸協(xié)議FTP這樣的協(xié)議等。
TCP和UDP是FTP、HTTP和SMTP之類使用的傳輸層協(xié)議。
雖然TCP和UDP都是用來傳輸其他協(xié)議的,它們卻有一個顯著的不同:TCP提供有保證的數(shù)據(jù)傳輸,而UDP不提供。
這意味著TCP有一個特殊的機制來確保數(shù)據(jù)安全的不出錯的從一個端點傳到另一個端點,而UDP不提供任何這樣的保證。
HTTP(超文本傳輸協(xié)議)是利用TCP在兩臺電腦(通常是Web服務(wù)器和客戶端)之間傳輸信息的協(xié)議。
客戶端使用Web瀏覽器發(fā)起HTTP請求給Web服務(wù)器,Web服務(wù)器發(fā)送被請求的信息給客戶端。
記住,需要IP協(xié)議來連接網(wǎng)絡(luò);TCP是一種允許我們安全傳輸數(shù)據(jù)的機制,使用TCP協(xié)議來傳輸數(shù)據(jù)的HTTP是Web服務(wù)器和客戶端使用的特殊協(xié)議。
Socket 接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,用以開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。