TCP/IP網絡編程第4~6章複習總結

要熟練掌握TCP內部工作原理

原理1:與對方套接字的連接(三次握手)

原理2:與對方主機的數據交換

原理3:斷開與套接字的連接(四次揮手)

 

 

 

 

 

 

 

 

 

利用TCP或UDP套接字收發數據時,需要利用下面的四層協議棧完成。

TCP/IP 協議棧:

應用層

TCP層 UDP層

IP層

鏈路層

 

 

鏈路層時物理鏈接標準化的結果,也就是最基本的領域。

IP層是面向消息的、不可靠的協議。在每次傳輸數據時會幫我們選擇路徑。

TCPUDP層以IP層提供的路徑信息爲基礎完成實際的數據傳輸。TCP協議確認後向不可靠的IP協議賦予可靠性。決定了數據傳輸方式。

網絡編程的大部分內容就是設計並實現應用層協議。

 

 

 

 

 

 

accept會自動創建一個用於與客戶端建立連接,並用於數據IO。

 

connect函數返回說明的是已經被服務端的listen函數接收到,而不是被accept了。因此connect函數返回後並不立即進行數據交換。

在調用connect函數時,操作系統自動創建套接字並自動分配,其中IP用計算機的IP,端口隨機。

 

在tcp時,要牢記收發數據是沒有數據邊界的。。。。即服務器即使調用了1次write函數傳輸40字節的數據,客戶端也有可能通過4次read函數調用每次讀取10字節。

TCP中IO緩衝的特性有如下四點

1、IO緩衝在每個TCP套接字中單獨存在。

2、IO緩衝在創建套接字時自動生成。

3、關閉套接字後也會繼續傳遞輸出緩衝中遺留的數據。

4、關閉套接字將丟失輸入緩衝中的數據。

TCP的滑動窗口協議保證了不會因爲緩衝溢出而丟失數據。

write函數返回的時間點時將數據移動到緩衝區時。

 

本次複習涉及到了三次握手,整理內容詳見:https://blog.csdn.net/qq_40962234/article/details/104183523

本次複習也涉及到了四次揮手,整理內容詳見:https://blog.csdn.net/qq_40962234/article/details/104183936

 

關於UDP和TCP的差異

簡單來說,TCP比UDP可靠,而UDP比TCP性能高,就是快。

詳細的區別再昨天的複習任務中有。

區分UDP和TCP的最重要的標誌是流控制機制。(TCP的生命就在於流控制)

當然可以這麼說:UDP和TCP的差異只在於流控制機制。!。

 

UDP最重要的作用就是根據端口號傳到主機的數據包交付給最終的UDP套接字。

傳輸壓縮文件是一般用TCP,傳輸直播數據一般用UDP,很好理解。

UDP實現特點:

UDP中的服務器端和客戶端沒有連接。

UDP服務器端和客戶端均只需1個套接字。

 

在UDP中套接字的地址分配有兩種方式

1、調用bind()函數分配,bind()函數不區分TCP和UDP.

2、在sendto()中會自動分配。

即若先使用了sendto(),就不需要bind()手動分配,若先要使用recvfrom(),就需要bind()先一步分配。

 

注意,在UDP通信過程中使用IO函數調用次數需要保持一致。

UDP套接字傳輸的數據包又稱爲數據報,實際上數據報也屬於數據包的一種。因爲UDP中存在數據邊界,一個數據包即可稱爲1個遠征數據,所以稱爲數據報!!!!

 

 

 

 

 

 

 

 

 

 

int listen(int sock, int backlog);                                

0

-1

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

accept(serv_sock,  (struct sockaddr*)&clnt_addr, &clnt_addr_size);

創建的套接字文件描述符

-1

int connect(int sock,     struct  sockaddr *servaddr,   socklen_t  addrlen);

connect(sock,   (struct  sockaddr*)&serv_addr,    sizeof(serv_addr));

0

-1

 

 

ssize_t   sendto(int    sock, void   *buf,   size_t  nbytes,  int   flags,  

struct   sockaddr  *to,   socklen_t   addrlen);

sendto(serv_sock, message, sre_len, 0, (strucr sockaddr *)&clnt_adr, clnt_adr_sz);

傳輸字節數

-1

ssize_t   recvfrom(int    sock, void   *buf,   size_t  nbytes,  int   flags,  

struct   sockaddr  *from,   socklen_t   *addrlen);

接受字節數

-1

 

 

 

 

 

 

 

 

 

 

 

實際上,sendto()函數每次傳輸數據時都會經歷以下三個階段:

1、向UDP套接字註冊目標IP和端口號。

2、傳輸數據

3、刪除UDP套接字中註冊的目標地址信息。

 

因此如果要重複好幾次的向同一個目標傳輸數據時。使用sendto傳輸的話會多進行好幾次的第一個步驟和第三個步驟。

此時需要使用connect函數使得UDO套接字變成已連接套接字。

若變成了已連接套接字,那麼不僅可以使用sendto、recvfrom函數還可以使用,還可以使用write、read函數進行通信。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章