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 ...