網路通訊TCP UDP 學習筆記

2021-09-26 00:18:00 字數 4818 閱讀 2022

參考文獻:35 張**被問千百遍的 tcp 三次握手和四次揮手面試題

一、網路通訊的基本概念

1、tcp和udp的區別

tcp(transmission control protocol):傳輸控制協議,面向連線的服務(類似打**),安全、可

靠(三次握手、響應+重傳、四次揮手),速度相對較慢,一般應用在對安全性、完整性有嚴格要求的場景:文

件傳輸(ftp)、smtp、http

三次握手:

a要知道,a能到b,b能到a

b要也要知道,a能到b,b能到a

a 你聽得到嗎 -> b(此時b知道了a能到b)

(a能到b且b能到a)a <- 我能聽到,你叫 b

a 我也能聽到-> b(此時b知道了b也能到a)

四次揮手:

目的是保證關閉前傳送完所有未傳送的資料報(應用層已經交給底層了,但底層還沒有完全傳送出去)。

a 傳送關閉請求 -> b

a <- 傳送請求相應 b

b檢查 是否有未傳送完成的資料

<- 可以關閉 b

a 傳送關閉訊息-> b

udp(user datagram protocol):使用者資料報文協議,面向無連線的服務(發簡訊)0,不保證安全、

2、訊息流

應用層->表示層->會話層->網路層->傳輸層->資料鏈路層->物理層->資料鏈路層->傳輸層->網路層

->會話層->表示層->應用層

3、訊息包

當socket收到乙個要傳送的資料時,會先把資料進行拆分成bit流,然後再組成(防丟失)資料報(可能會丟包)。

二、套接字

socket是一種介面機制,可以讓程式無論使用什麼埠、協議、都可以從socket進出資料,它負責了程序與協

議之間的連線。

1、程式設計模型

點對點(p2p):一對一通訊

客戶機/伺服器(c/s):一對多通訊

2、函式

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

功能:建立socket描述符,可以把socket當作檔案來看待,傳送資料就是寫檔案,接收資料就是讀檔案。

domain:位址型別

af_unix/af_local/af_file 本地通訊(程序間通訊)

af_inet 基本32ip位址通訊,ipv4 internet protocols

af_inet6 基本128ip位址通訊,ipv6,ipv6 internet protocols

type:通訊協議

sock_stream 資料流協議,tcp

sock_dgram 資料報協議,udp

protocol:特別通訊協議,給0即可。

返回值:socket描述符,類似檔案描述符

3、通訊位址

注意:函式介面定義的是sockaddr,而實際提供的是sockaddr_un或sockaddr_in

struct socketaddr

struct sockaddr_un ;

struct sockaddr_in

struct in_addr

4、繫結

socket描述符與物理通訊載體(網絡卡或socket檔案)繫結在一起。

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd:socket描述符:socket函式的返回值

5、連線

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd:socket描述符

返回值:在不同的程式設計模型下返回值意義不同,在本地通訊

返回加0,失敗返回-1。

6、資料接收與傳送:read/write

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

recv/send與read/write功能一樣,flags多了是否阻塞的功能(0阻塞,1不阻塞)。

7、關閉套接字:close

如果是網路通訊,埠號並不會立即**,大概會占用3分鐘左右。

8、位元組序轉換

#include uint32_t htonl(uint32_t hostlong);

功能:把32位本機位元組序轉換成32位的網路位元組序

uint16_t htons(uint16_t hostshort);

功能:把16位本機位元組序轉換成16位的網路位元組序

uint32_t ntohl(uint32_t netlong);

功能:把32位網路位元組序轉換成32位的本機位元組序

uint16_t ntohs(uint16_t netshort);

功能:把16位網路位元組序轉換成16位的本機位元組序

9、ip位址轉換

#include #include #include int inet_aton(const char *cp, struct in_addr *inp);

in_addr_t inet_addr(const char *cp);

char *inet_ntoa(struct in_addr in);

10、本地通訊程式設計模型

程序a 程序b

建立套接字(af_local) 建立套接字(af_local)

準備位址(sockaddr_un) 準備位址(sockaddr_un)

繫結(自己的socket/位址) 連線(connect,連線程序a的位址)

接收資料 傳送資料

關閉套接字

三、基於tcp協議的c/s模型

int listen(int sockfd, int backlog);

功能:設定等待連線的最大數量

sockfd:被監聽的socket描述符

backlog:等待連線的最大數量(排隊的數量)

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

功能:等待連線sockfd連線

返回值:專門用於通訊的描述符

程式設計模型:

server client

建立socket套接字 建立socket套接字

準備位址(sockaddr_in,本機位址) 準備位址(伺服器位址)

繫結(bind) 。。。

監聽(listen) 。。。

等待連線(accept、fork) 連線(connect)

接收請求(read/recv) 傳送請求(write/send)

響應請求(write/send) 接收響應(read/recv)

關閉(close) 關閉(close)

四、基於udp協議的c/s模型

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,  const struct sockaddr *dest_addr, socklen_t addrlen);

功能:udp協議專用的資料傳送函式

sockfd:套接字描述符

len:待傳送的資料位元組數

flags:0阻塞,1不阻塞

addrlen:位址結構體的位元組數

返回值:成功傳送的位元組數

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

功能:udp協議專用的資料接收函式

sockfd:套接字描述符

buf:資料儲存位置

len:最大接收位元組數

flags:0阻塞,1不阻塞

返回值:成功接收的位元組數。

程式設計模型:

server client

建立套接字(socket) 建立套接字(socket)

準備位址(本機位址sockaddr_in) 準備位址(目標機位址sockaddr_in)

繫結(bind(sockfd+addr)) 。。。

接收請求(recvfrom) 傳送請求(sendto)

響應請求(sendto) 接收響應(recvfrom)

關閉套接字(close) 關閉套接字(close)

注意:從伺服器到客戶端返回的路線是udp協議自己設計的。

網路通訊TCP UDP

這個學期幾乎都在學網路通訊的內容。基於tcp協議的通訊,通過乙個socket來連線伺服器和客戶機之間的通訊。要求雙方必須要連線之後,才能傳送和接受訊息。如果有一方斷開連線,則通訊終止。這保證了訊息傳輸的準確性,不會發生訊息的丟失,但是通訊的速度有所降低。基於udp協議的通訊,不要求伺服器和客戶機連線...

網路通訊之TCP UDP

1 udp乙個socket接收緩衝區的預設值 cat proc sys net core rmem default 212992,單位byte,208kb 3 每個udp socket都有乙個接收緩衝區,沒有傳送緩衝區,從概念上來說就是只要有資料就發,不管對方是否可以正確接收,所以不緩衝,不需要傳送...

Qt網路通訊學習筆記

1.tcp socket通訊 tcp即transmission control protocol,傳輸控制協議。與udp不同,它是面向連線和資料流的可靠傳輸協議。也就是說,它能使一台計算機上的資料無差錯的發往網路上的其他計算機,所以當要傳輸大量資料時,我們選用tcp協議。tcp協議的程式使用的是客戶...