UDP和TCP都屬于Socket協(xié)議。
UDP的特點(diǎn):
1、每一次發(fā)送數(shù)據(jù)都需要綁定IP和端口號(hào)。相當(dāng)于發(fā)送郵件,只管是否發(fā)送成功,不保證對(duì)方是否接收到數(shù)據(jù),所以UDP是不安全的,有可能會(huì)丟失數(shù)據(jù)包。
2、UDP:類似于HTTP,也屬于短連接。
TCP的特點(diǎn):
1、只需要一次連接,屬于 長(zhǎng)連接,只要不斷開的情況可以一直使用。TCP好像打電話,雙方要通話,首先,要確定對(duì)方不是開機(jī)(網(wǎng)絡(luò)可以到達(dá)),然后要確定是不是沒有信號(hào),然后還需要對(duì)方接聽(通信鏈接)。
2、TCP通過3次“握手”來保證數(shù)據(jù)發(fā)送的安全性,不會(huì)丟失數(shù)據(jù)包。
詳解:
OSI:開放系統(tǒng)互連參考模型:由下往上為
物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層
其中:
傳輸層:分割并重新組裝上層提供的數(shù)據(jù)流,為數(shù)據(jù)流提供端到端的傳輸服務(wù)。

因?yàn)?,?duì)應(yīng)傳輸層而言,它只需要知道目標(biāo)主機(jī)上的哪個(gè)服務(wù)程序來響應(yīng)這個(gè)程序,而不需要知道這個(gè)服務(wù)程序是干什么的。因此,我們只需要能夠抽象的表示出來這些應(yīng)用程序和服務(wù)程序即可。我們使用端口號(hào)來抽象標(biāo)識(shí)每個(gè)網(wǎng)絡(luò)程序。
傳輸層有兩大協(xié)議,即:TCP(傳輸控制協(xié)議)UDP(用戶數(shù)據(jù)包協(xié)議)。TCP和UDP可以接收來自多個(gè)應(yīng)用程序的數(shù)據(jù)流,并用端口號(hào)標(biāo)識(shí)他們,然后把他們送給Internet層處理。同時(shí)TCP和UDP接收來自Internet層的數(shù)據(jù)包,也用端口號(hào)區(qū)分他們,然后交給不同的應(yīng)用程序。
因此:在同一IP地址(同一個(gè)目標(biāo)主機(jī))上不同的端口號(hào)是兩個(gè)不同的鏈接。IP地址和端口號(hào)用來唯一的確定網(wǎng)絡(luò)上數(shù)據(jù)的目的地。
TCP中的“三次握手”:
目的:TCP是面向鏈接的(即端to端),在面向鏈接的環(huán)境中,開始傳輸數(shù)據(jù)之前,在兩個(gè)中端之間必須先建立一個(gè)鏈接。建立鏈接的過程可以確保通信雙方在發(fā)送應(yīng)用程序數(shù)據(jù)包之前,都已經(jīng)準(zhǔn)備好了傳送和接收數(shù)據(jù)。并且使通信雙方統(tǒng)一了初始化序列號(hào)。
過程:傳輸前,需要進(jìn)行三次握手建立鏈接。而通信結(jié)束后,通信雙方都會(huì)使用改進(jìn)的三次握手來關(guān)閉鏈接。

SYN:seq=X;
1、A的TCP程序,為這個(gè)鏈接分配一個(gè)端口(設(shè)為9090)。
2、同時(shí)邏輯上的將TCP連接的狀態(tài)設(shè)置為:正在連接。(通過在鏈接狀態(tài)表中添加一條記錄,記錄中狀態(tài)為:正在連接)
3、同時(shí),隨機(jī)生成一個(gè)初始序列號(hào)X,生成一個(gè)TCP包,將初始化序列號(hào)X設(shè)置為TCP中的序列號(hào),發(fā)送給主機(jī)B。
SYN:seq=Y ? ACK:ack=X+1;
1、B上TCP程序收到該數(shù)據(jù)包,查詢9091端口狀態(tài),如果可以鏈接。
2、同樣的,在邏輯上的將TCP連接的狀態(tài)設(shè)置為:正在連接
3、同時(shí),隨機(jī)生成一個(gè)初始化序列號(hào)Y,根據(jù)接收的序列號(hào)X,生成應(yīng)答號(hào)X+1,生成一個(gè)TCP包,將序列號(hào)和應(yīng)答號(hào)分別設(shè)置到TCP包頭中,將TCP數(shù)據(jù)包發(fā)給主機(jī)A。
SYN:seq=X+1 ? ACK:ack=Y+1.
1、A上的TCP程序接收到數(shù)據(jù)包,查詢9090端口狀態(tài)。
2、根據(jù)收到的SYN:seq=Y;ACK:ack=X+1; 封裝一個(gè)TCP包 SYN:seq=x+1;ACK:ack=Y+1;發(fā)送給主機(jī)B。同時(shí),TCP程序?qū)㈡溄訝顟B(tài)表中該條記錄狀態(tài)設(shè)置為已連接。
3、主機(jī)B收到數(shù)據(jù)包,TCP程序?qū)㈡溄訝顟B(tài)表中該條記錄狀態(tài)設(shè)置為已連接。
至此,一個(gè)TCP鏈接建立(三次握手)完成。
我們可以看到:
第一:傳送的都是IP數(shù)據(jù)包,其實(shí)只是將收到的數(shù)據(jù)包交給TCP程序處理。
第二:鏈接狀態(tài),只是TCP程序中的一個(gè)邏輯狀態(tài)。