UNP筆記2 TCP套介面函式

2021-05-22 19:24:13 字數 2756 閱讀 4287

4.1 tcp連線和啟動

tcp連線

4.2 socket函式

分配最小的未用socket控制代碼

#include

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

family         說明

————————      ——————————

af_inet        ipv4

af_inet6    ipv6

af_local    unix域協議

af_route    路由套介面

af_key        金鑰套介面

type        說明

————————   ———————————

sock_stream    位元組流套介面

sock_dgram    資料報套介面

sock_seqpacket    有序分組套介面

sock_raw    原始套介面

protocol    說明

——————————   ————————————

ipproto_tcp    tcp

ipproto_udp    udp

ipproto_sctp    sctp

af_inet

————————————  ——————————

sock_stream    tcp|sctp

sock_dgram    udp

sock_seqpacket    sctp

sock_raw    ipv4

4.3 connect函式

客戶通常使用connect來主動地與伺服器建立連線

#include

int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen); 由程序到核心

套介面位址中必須含有sin_addr和sin_port,還有sin_family

如果是tcp套介面會激發tcp的三次握手。所以有下面的狀態轉換。

closed->syn_sent->established.

若connect返回失敗,則不可再用,必須重新socket.

4.4 bind 函式

將socket控制代碼與本地或遠地位址相關聯。

#include

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

0-成功,-1-出錯

1 伺服器在啟動時**眾所周知埠。servaddr.sin_port=ptons(13);//專用於daytime服務

如果沒有呼叫bind**乙個埠,當呼叫connect,和listen時,核心就會為相應的套介面選擇乙個臨時埠。

伺服器正是通過眾所周知的埠被大家認識的

2 程序可以將乙個特定的ip位址**到它的套介面上,但這個ip位址必須為所在主機的網路介面之一。

對於tcp客戶端,為該套介面上傳送的ip資料報指派了ip位址

對於tcp伺服器,限定只能接受目的位址為該ip的客戶連線

3 如果伺服器沒有將ip位址**到其套介面上,核心就將客戶傳送的syn的宿ip位址作為伺服器的ip位址。

4 通配位址inaddr_any來指定,允許伺服器在任意網路介面上接受客戶連線

5 如果讓核心來為套介面選擇乙個臨時埠號,呼叫getsockname才可返回協議位址。

4.5 listen函式

做兩件事情:

1 規定了核心為相應套介面排隊的最大連線數

2 當socket建立乙個套介面時,被假設為乙個主動套介面。是乙個即將呼叫connect發起連線的客戶套介面。listen則將乙個未連線的套介面轉換成乙個被動套介面,指示核心要接受指向該套介面的連線請求。closed-》listen

#include

int listen(int sockfd,int backlog);

0-succ,1-fail

理解backlog引數

核心為任何乙個給定的監聽套介面維護兩個佇列:

1 未完成連線佇列——已經由客戶發出並到達伺服器,但是伺服器在等待tcp握手。這些套介面處於syn_rcvd

2 已完成連線佇列——已完成tcp握手。處於established狀態

tcp三次握手和監聽套介面的兩個佇列

當程序呼叫accept時,已完成連線佇列中的對頭項將返回給程序。

4.6 accept函式

從已完成連線佇列頭返回下乙個已完成連線

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

-1-fail

cliaddr(客戶程序的協議位址)和addrlen返回已連線的對客戶的協議位址。如果對客戶端不敢興趣,可以都寫為null

呼叫前,*addrlen的整數值 置為由cliaddr所指的套介面位址結構的長度。

返回時,*addrlen的整數值為由核心存在該套介面位址結構內的確切位元組數

accept的返回治由核心自動生成的乙個全新描述字,代表與所返回的客戶tcp連線。

監聽套介面:socket生成,用在bind,listen,accept中

連線套介面:accept生成

兩者的區分:

乙個伺服器僅僅建立乙個監聽套介面,在該伺服器生命週期內一直存在。

核心為每個由伺服器程序接受的客戶連線建立乙個已連線套介面(即該連線的3次握手已經完成),當完成該服務時,相應的連線套介面就關閉了

Python 網路程式設計2 TCP

tcp協議全稱 傳輸控制協議,顧名思義,就是要對資料的傳輸進行一定的控制 tcp協議的特點 1 相對於傳輸層的udp協議,tcp協議的特點是面向連線的 可靠的傳輸和位元組流。2 使用tcp協議通訊的雙方必須首先建立連線,然後才能開始資料的讀寫。雙方都必須為該連線分配必要的核心資源,以管理連線的狀態和...

實用TCP協議(2) TCP 引數優化

在了解 tcp 的基本機制後本文繼續介紹 linux 核心提供的鏈結佇列 tw reuse so reuseport syn cookies 等機制以優化生產環境中遇到的效能問題。linux 核心會維護兩個佇列 佇列滿後伺服器會丟棄溢位的連線會導致的情況 全連線佇列溢位時伺服器根據 net.ipv4...

網路通訊2 TCP的函式

1.inet addr 函式 函式作用 十進位制轉換成二進位制 函式原型 int inet addr const char strptr 2.inet pton函式 函式原型 int inet pton int family,const char src,void dst 引數 family af ...