TCP與UPD知識總結

2021-08-08 19:44:00 字數 3187 閱讀 8887

1、udp

udp是面向訊息或面向資料報的協議。

udp把應用程式一次性寫入的資料打包成乙個udp資料報,然後就把該資料報通過ip傳送出去,

接收方收到的也是同樣的乙個udp資料報,即這個資料傳輸的過程是以資料報作為單位的。

udp保持了每次應用程式所傳送的訊息的邊界。

2、tcp

tcp資料傳輸的過程並不是以資料報或者訊息作為單位,而是以位元組流的方式進行的
tcp/udp介紹

tcp(transfer control protocol)傳輸控制協議是一種面向連線的協議, 當我們的網路程式使用這個協議的時候,

網路可以保證我們的客戶端和服務端的連線是可靠的,安全的.

udp(user datagram protocol)使用者資料報協議是一種非面向連線的協議, 

這種協議並不能保證我們的網路程式的連線是可靠的,所以我們現在編寫的程式一般是採用tcp協議的.

(二)linux網路程式設計–初等網路函式介紹(tcp)

int socket(int domain, int type,int protocol)

(二)bind

int bind(int sockfd, struct sockaddr *my_addr, int addrlen)

sockfd:是由socket呼叫返回的檔案描述符.

addrlen:是sockaddr結構的長度.

my_addr:是乙個指向sockaddr的指標. 在中有 sockaddr的定義

struct sockaddr;
不過由於系統的相容性,我們一般不用這個標頭檔案,而使用另外乙個結構(struct sockaddr_in) 來代替.在中有sockaddr_in的定義

struct sockaddr_in

我們主要使用internet所以

sin_family一般為af_inet,

sin_addr設定為inaddr_any表示可以和任何的主機通訊,

sin_port是我們要監聽的埠號.sin_zero[8]是用來填充的.

bind將本地的埠同socket返回的檔案描述符**在一起.成功是返回0,失敗的情況和socket一樣

(三)listen

int listen(int sockfd,int backlog)

sockfd:是bind後的檔案描述符.

backlog:設定請求排隊的最大長度.當有多個客戶端程式和服務端相連時, 使用這個表示可以介紹的排隊長度.

listen函式將bind的檔案描述符變為監聽套接字.返回的情況和bind一樣.

(四)accept

int accept(int sockfd, struct sockaddr *addr,int *addrlen)

sockfd:是listen後的檔案描述符.

addr,addrlen是用來給客戶端的程式填寫的,伺服器端只要傳遞指標就可以了. bind,listen和accept是伺服器端用的函式,

accept呼叫時,伺服器端的程式會一直阻塞到有乙個 客戶程式發出了連線. accept成功時返回最後的伺服器端的檔案描述符,

這個時候伺服器端可以向該描述符寫資訊了. 失敗時返回-1

(五)connect

int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)

sockfd:socket返回的檔案描述符.

serv_addr:儲存了伺服器端的連線資訊.其中sin_add是服務端的位址

addrlen:serv_addr的長度

connect函式是客戶端用來同服務端連線的.成功時返回0,sockfd是同服務端通訊的檔案描述符 失敗時返回-1.

tcp三次握手

三次握手

tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線:

位碼即tcp標誌位,有6種標示:

syn(synchronous建立聯機)

ack(acknowledgement 確認)

psh(push傳送)

fin(finish結束)

rst(reset重置)

urg(urgent緊急)

sequence number(順序號碼)

acknowledge number(確認號碼)

客戶端tcp狀態遷移:

closed->syn_sent->established->fin_wait_1->fin_wait_2->time_wait->closed

伺服器tcp狀態遷移:

closed->listen->syn收到->established->close_wait->last_ack->closed

tcp/ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線,如圖1所示。

(1)第一次握手:建立連線時,客戶端a傳送syn包(syn=j)到伺服器b,並進入syn_send狀態,等待伺服器b確認。

(2)第二次握手:伺服器b收到syn包,必須確認客戶a的syn(ack=j+1),同時自己也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器b進入syn_recv狀態。

(3)第三次握手:客戶端a收到伺服器b的syn+ack包,向伺服器b傳送確認包ack(ack=k+1),此包傳送完畢,客戶端a和伺服器b進入established狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送資料。

tcp連線是全雙工的(雙工傳輸)

是指交換機在傳送資料的同時也能夠接收資料,兩者同步進行,這好像我們平時打**一樣,說話的同時也能夠聽到對方的聲音。目前的交換機都支援全雙工。

tcp的連線的拆除需要傳送四個包,因此稱為四次揮手(four-wayhandshake)。客戶端或伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()操作即可產生揮手操作。

(1)客戶端a傳送乙個fin,用來關閉客戶a到伺服器b的資料傳送。
(2)伺服器b收到這個fin,它發回乙個ack,確認序號為收到的序號加1。和syn一樣,乙個fin將占用乙個序號。

(3)伺服器b關閉與客戶端a的連線,傳送乙個fin給客戶端a。

(4)客戶端a發回ack報文確認,並將確認序號設定為收到序號加1

TCP知識總結

1 tcp建立連線需要三次握手,斷開連線時需要四次揮手 2 用連續arq協議 gbn,選擇確認 3 流量控制 4 擁塞控制 第一次握手 客戶端向伺服器端傳送syn報文段,並隨機生成乙個序號seq client一起發給伺服器端,傳送之後客戶端變為syn sent狀態。第二次握手 伺服器收到了包含tcp...

TCP和UDP知識總結

1.tcp粘包 tcp是面向連線 流式傳送的,沒有明確的邊界定義。他有乙個緩衝區,每過一段時間或者快取滿了就傳送出去,造成一次傳送的資料可能是多個包或者包的一部分,這就是傳送端的粘包。接收端的粘包指應用程式沒有及時處理緩衝區中的資料,後續到達的資料繼續放到快取中。解決方法 a.對傳送的資料劃分邊界,...

tcp和upd的區別?為啥要用udp

首先,先說一下tcp和udp的區別。1.tcp是面向連線的協議,有確認重傳機制,流量控制機制等 而udp是非面向連線的協議,盡力而為的傳送資料,重傳由上層協議來控制,也可以使用connect 來控制。2.從頭部結構來說,tcp因為有選項部分,所以有首部長度字段 而udp沒有選項部分,所以不需要首部長...