Socket程式設計和TCP原理

2021-09-25 11:55:15 字數 1540 閱讀 2809

計算機專業在大學裡學習的網路課程裡,留給大家印象最深刻的就是osi的7層模型、tcp/ip的4層模型,講到tcp,面試問最多就是建立連線的三次握手和斷開連線的四次揮手。但在實際專案或程式設計應用中,這些理論知識似乎應用不上,我們只需要知道一些api就可以實現伺服器、客戶端的網路程式設計了。

socket程式設計怎麼和tcp的原理關聯起來呢?怎麼理解socket委託或者呼叫作業系統實現的tcp/ip協議棧做的具體工作呢?我覺得有必要結合具體的**梳理這個流程,幫助程式設計師理解api背後的邏輯,對我們查詢、解決問題應該會很有幫助。

首先介紹下基礎理論知識:

tcp是屬於第3層傳輸層的協議,ip是第2層網路層的協議,這是tcp/ip網路協議簇的最為核心的2個協議。不同的作業系統有自己的不同版本的網路協議棧的實現,總體上是上層委託或呼叫下層的協議來實現。

tcp/ip協議簇總體上分為4層,包含幾十個協議,比如ppp、arp、icmp、rip,可以參看下表:

比如處於網路介面層(第2層)的slip(序列線網際網路協議),ppp(點到點協議),arp(位址解析協議),rarp(反向位址解析協議);

層次層次名稱

協議第4層

應用層http(超文字傳輸協議),smtp(簡單郵件傳輸協議),ftp(檔案傳輸協議),dns(網域名稱系統),dhcp(動態主機配置協議)

第3層傳輸層

tcp(傳輸控制協議),udp(使用者資料報協議)

第2層網路層

arp(位址解析協議),ip(網際協議),ipsec(ip安全性),icmp(網際網路控制報文協議),

第1層網路介面層

slip(序列線網際網路協議),ppp(點到點協議)

tcp全稱為傳輸控制協議,它建立和管理裝置之間的連線,並在使用ip時確保可靠的、具有流量控制的資料交付。

一、socket位址結構

// ipv4的socket位址結構

struct in_addr;

struct sockaddr_in;

// 通用的socket位址結構

struct sockaddr ;

對伺服器來說,需要繫結埠,為客戶端連線提供服務。需要有以下幾個步驟:

1.建立套接字

int socket(int domain, int type, int protocol);
函式返回socket描述符,用以標識本機的不同網路連線,作業系統將socket視為一種資源檔案,linux下開啟檔案數目不同使用者是有不同限制的,有時候伺服器遇到連線數受限問題,可以查查這方面的問題。

domain引數一般取af_inet

type:表示套接字型別,sock_stream表示是tcp,sock_dgram表示udp

protocol:表示協議,一般設為0

當呼叫這個函式後,應用程式會得到可以控制socket的描述符,協議棧申請記憶體空間,用於儲存維持連線或傳送資料報需要的控制資訊

2. 繫結埠

int bind(int sockfd, struct sockaddr *sa, int addrlen);

Socket 程式設計 TCP 和UDP

三次握手過程 1.建立連線時,客戶端傳送syn包到伺服器,並進入syn sent狀態,等待伺服器確認。2.伺服器收到syn包,反饋乙個syn ack包,進入syn recv狀態。3.客戶端接到伺服器的syn ack包,向伺服器傳送確認包ack,同時進入established狀態,三次握手完成。伺服器...

Socket 程式設計(TCP)

詳細請參見 點我o o哈!很不錯的一篇文章哈 下面是接收資料和傳送資料的函式 int receive socket fd,char sztext,int len if rc 0 return len cnt sztext rc cnt rc return len int send socket fd...

Socket 程式設計(TCP)

下面是接收資料和傳送資料的函式 cpp view plain copy intreceive socket fd,char sztext,intlen if rc 0 return len cnt sztext rc cnt rc return len int send socket fd,char...