網絡協議棧
網絡基礎
-
在Linux網絡編程中,網絡協議主要分爲五層
應用層
傳輸層
網絡層
鏈路層
物理層 -
TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,是一個工業標準的協議集,它是爲廣域網(WANs)設計的。
TCP/IP協議存在於OS中,網絡服務通過OS提供,在OS中增加支持TCP/IP的系統調用——Berkeley套接字,如Socket,Connect,Send,Recv等 -
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是屬於TCP/IP協議族中的一種。
-
socket位於應用層和傳輸層之間的socket抽象層
-
集線器 交換機 路由器
集線器 只是電信號的放大和分流 電氣層 物理層
交換機 交換的是網幀, 鏈路層
路由器 交換的是報文 網絡層 -
以下三個網段被用作內網網段
192網段
172網段
10網段 -
tcp 報文格式
-
IP 報文格式
-
MAC幀格式
-
數據傳輸過程詳解圖
socket詳解
-
socket套接字:
socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。Socket就是該模式的一個實現, socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉).
說白了Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。 -
對於每個程序系統都有一張單獨的表。精確地講,系統爲每個運行的進程維護一張單獨的文件描述符表。當進程打開一個文件時,系統把一個指向此文件內部數據結構的指針寫入文件描述符表,並把該表的索引值返回給調用者 。應用程序只需記住這個描述符,並在以後操作該文件時使用它。操作系統把該描述符作爲索引訪問進程描述符表,通過指針找到保存該文件所有的信息的數據結構。
tcp連接的三次握手和四次揮手
- 三次握手
- TCP協議通過三個報文段完成連接的建立,這個過程稱爲三次握手(three-way handshake),過程如下圖所示。
- 第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。
- 第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
- 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
一個完整的三次握手也就是: 請求—應答—再次確認。
當客戶端調用connect時,觸發了連接請求,向服務器發送了SYN J包,這時connect進入阻塞狀態;服務器監聽到連接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;客戶端收到服務器的SYN K ,ACK J+1之後,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立
- 四次揮手
由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送(報文段4)。
(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。
(3)服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A(報文段6)。
(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1(報文段7)。
tcp網絡編程模型
udp編程模型圖
不做過多文字描述…有錯誤之處歡迎指出。