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沒有選項部分,所以不需要首部長...