socket

前言:在我大學的時候,socket是一個沒有聽過的概念,應該是自己不好好聽課的原因。so,少壯不努力,現在哭唧唧。。

TCP/IP協議簡介

TCP/IP即傳輸控制協議/網間協議,定義了主機如何連入因特網及數據如何再它們之間傳輸的標準,TCP/IP協議是指因特網整個TCP/IP協議族。不同於ISO模型的七個分層,TCP/IP協議參考模型把所有的TCP/IP系列協議歸類到四個抽象層中。

  • 應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
  • 傳輸層:TCP,UDP
  • 網絡層:IP,ICMP,OSPF,EIGRP,IGMP
  • 數據鏈路層:SLIP,CSLIP,PPP,MTU

每一抽象層建立在低一層提供的服務上,並且爲高一層提供服務,看起來大概是這樣子的
在這裏插入圖片描述
在TCP/IP協議中兩個因特網主機通過兩個路由器和對應的層連接。各主機上的應用通過一些數據通道相互執行讀取操作。

socket

兩個進程如果需要進行通訊最基本的一個前提是能夠唯一的標示一個進程,在本地進程通訊中我們可以使用PID來唯一標示一個進程,但PID只在本地唯一,網絡中的兩個進程PID衝突機率很大,我們知道IP層的ip地址可以唯一標示主機,而TCP層協議和端口號可以唯一標示主機的一個進程,這樣我們可以利用ip地址+協議+端口號唯一標示網絡中的一個進程。

能夠唯一標示網絡中的進程後,它們就可以利用socket進行通信了,我們經常把socket翻譯爲套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象爲幾個簡單的接口,供應用層調用已實現進程在網絡中通信。

在這裏插入圖片描述
socket起源於UNIX,在Unix一切皆文件哲學的思想下,socket是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在建立連接打開後,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。

**

socket通信流程

socket是"打開—讀/寫—關閉"模式的實現,以使用TCP協議通訊的socket爲例,其交互流程大概是這樣子的:
在這裏插入圖片描述
服務器根據地址類型(ipv4, ipv6)、socket類型、協議創建socket

服務器爲socket綁定ip地址和端口號

服務器socket監聽端口號請求,隨時準備接收客戶端發來的連接,這時候服務器的socket並沒有被打開

客戶端創建socket

客戶端打開socket,根據服務器ip地址和端口號試圖連接服務器socket

服務器socket接收到客戶端socket請求,被動打開,開始接收客戶端請求,直到客戶端返回連接信息。這時候socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連接信息後才返回,開始接收下一個客戶端諒解請求

客戶端連接成功,向服務器發送連接狀態信息

服務器accept方法返回,連接成功

客戶端向socket寫入信息

服務器讀取信息

客戶端關閉

服務器端關閉

**

三次握手

在這裏插入圖片描述
在TCP/IP協議中,TCP協議通過三次握手建立一個可靠的連接。

  • 第一次握手:客戶端嘗試連接服務器,向服務器發送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待服務器確認;

  • 第二次握手:服務器接收客戶端syn包並確認(ack=j+1),同時向客戶端發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

  • 第三次握手:第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

定睛一看,服務器socket與客戶端socket建立連接的部分其實就是大名鼎鼎的三次握手。
在這裏插入圖片描述

socket編程API
參考該網址:
https://www.cnblogs.com/dolphinX/p/3460545.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章