目錄
什麼是套介面?socket、套介面、套介面描述符之間的關係
如何建立套介面?
套介面用來做什麼?
syn:同步序列編號(synchronize sequence numbers),是tcp/ip建立連線時使用的握手訊號。
ack:確認字元(acknowledge character),在資料通訊中,接收站發給傳送站的一種傳輸類控制字元。表示發來的資料已確認接收無誤。
在客戶機和伺服器之間建立正常的tcp網路連線時,客戶機首先發出乙個syn訊息,伺服器使用syn+ack應答表示接收到了這個訊息,最後客戶機再以ack訊息響應。這樣在客戶機和伺服器之間才能建立起可靠的tcp連線,資料才可以在客戶機和伺服器之間傳遞。
unp 的譯者在 p6 中的譯註中提到:socket 一詞應該譯成「套介面」,理由如下:首先,作為網路程式設計 api 之一的套介面(sockets.注意這種用法總是採用複數形式,例如 sockets api、sockets library)跟 xti 一樣,是應用層到傳輸層或其他協議層的訪問介面。其次,具體使用的套介面時與 unix 管道的某一端類似的東西,我們既可以往這個「口」寫資料,也可以從這個「口」讀取資料。最後,套介面函式使用套介面描述字訪問具體的套介面,如果把套介面描述字的簡稱 socketfd 譯成「套接字」倒比較合適。從這個意義上來講,乙個套介面可以對應多個套接字,因為 unix 的描述字既可以複製,也可以繼承,反過來,乙個套接字對應且只對應乙個套介面。
unix下通過 socket 函式建立套介面,該函式原型是:
int socket(int family, int type, int protocol)。
其中,family 引數指明協議族,它是 af_inet(ipv4 協議)、af_inet6(ipv6)協議、af_local()、af_route(路由套介面)、af_key(金鑰套介面)中的一種。
其中, type 指明套介面型別,它是sock_stream(位元組流套介面)、sock_dgram(資料報套介面)、sock_seqpacket(有序分組套介面)、sock_raw(原始套介面)中的乙個。
其中,protocol 是 ipproto_tcp( tcp 協議)、ipproto_udp( udp 協議)、ipproto_sctp(sctp協議)中的一種。
如果建立成功返回套介面描述符,簡稱套接字
在客戶端:通過 connet() 用來與伺服器建立連線。connet() 函式原型如下:
int connec(int sockfd, const struct socktaddr *servaddr, socklen_t addrlen);
其中,sockfd 就是套介面描述符(用來描述套介面)。
其中,servaddr 是套介面位址結構,這個結構用來指定 connect() 要連線的伺服器的 ip 和 埠號。
其中,addrlen 時套介面位址結構的大小。
由於 connect() 函式要在客戶端與伺服器端建立連線,所以在呼叫 connect() 的時候會激發三次握手:1.主動請求連線方向被動請求連線方傳送乙個 syn 分節,此時主動方處於 syn_sent 狀態,如果被動方收到 syn 分節,並返回乙個 ack 和 乙個自己的 syn,此時被動方處於syn_rcvd 狀態。呼叫 connect() 的主動方接受到被動方回應的 ack 後,connect() 返回 0(表示成功),否則回返回 -1(出錯)。connect() 成功返回後,主動方處於 established 狀態,表示連線已經建立。並向被動方傳送乙個 ack(用來回應被動方傳送的 syn 分節)。
在伺服器端:在伺服器端稍微複雜一點點,要比客戶端多兩個步驟:
1、用 bind() 函式將乙個本地協議位址賦予乙個套介面。對於網際位址時 32 為的 ipv4位址或 128 位的 ipv6 位址與 16 位的 tcp 或 udp 埠號的組合。bind() 函式原型如下:
int bind(int sockfd,const struct sockaddr *myaddr ,socklen_t addrlen);
bind() 函式的原型和 connect() 一樣,但作用還是有差別的。connect() 是將 sockfd 與套介面位址結構對應的伺服器建立連線,而 bind() 是將 sockfd 與本地套介面位址結構進行繫結。
2、呼叫 listen() 函式將套介面變成監聽套介面,listen() 原型如下:
int listen(int sockfd, int backlog);
其作用有兩個:a.將乙個未連線的套介面轉換成乙個被動套介面,只是核心應該接受指向該套介面的的連線請求。並使套介面從 closed 狀態轉換到 listen 狀態。
b.listen() 的第二個引數規定了核心應該為相應套介面排隊的最大連線個數。
3、呼叫 accept() 函式在監聽套介面(由listen()轉化的套介面描述符)接受新連線的到達,如果沒有新連線到達那麼程序就投入睡眠(假設套介面為預設的阻塞方式)。上面我說過,客戶端是通過 connect() 來建立連線的,在客戶端收到伺服器端的 ack時,connect() 函式返回,並且傳送乙個 ack,當伺服器端接受到這個 ack 時,此時三次握手完成。連線建立完成,新連線到達,此時,伺服器端的監聽套介面轉換成 established 狀態,accept() 成功返回。
accept() 函式原型如下:int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
其中, sockfd 時監聽套介面,cliaddr 是已連線的對端程序(客戶)的協議位址。addrlen 是值-結果引數,是記憶體存在該套介面位址結構(cliaddr)的確切位元組數。
accept() 返回非負描述符,我們稱其為已連線套介面描述符。一定要區別監聽套介面描述符和已連線套介面描述符,一般來說伺服器在其生命週期內只建立乙個監聽套介面描述符,而核心為每個由伺服器程序接受的客戶連線建立乙個已連線套介面。
什麼是介面
api應用程式程式設計介面 是一些預先定義的函式 目的是提 用程式與開發人員基於某軟體或硬體是以訪問一組列程的能力 而又無需訪問原始碼 或理解內部工作機制的細節 膝上型電腦上提供了各種物理硬體,我們不需要關注這些介面的工作原理 只需要通過這些介面滿足我們的使用需求即可 什麼是介面測試 介面測試是對系...
什麼是介面??
介面是乙個共享框架,供兩個系統互動的時候使用,其中可以進行一些資訊轉換的工作,使得兩個系統之間的資訊和共享進而完成通訊 1.介面是也是乙個供兩個系統互動資料的工具,不過這個兩個系統乙個是程式設計師,乙個是程式中的類物件。2.介面就是完成了人和類物件之間的資料互動 3.想想微控制器或微機原理中的介面晶...
什麼是介面?
概述 介面 就可以理解為 膠帶 膠布 插口 提供轉接的扣子,用來連線而開放的入口。它的存在是為了讓兩種事物連線在一起 描述如何讓兩種事物連線在一起的抽象 我們知道,如果某個裝置需要向電腦中讀取或者寫入某些東西,這些裝置一般都是採用usb方式與電腦連線的,我們發現,只要帶有usb功能的裝置就可以插入電...