9/15/2017 最近在學UNIX網絡編程,感覺理論基礎不夠,所以整理了一遍相關的知識
Socket簡介
兩個進程能夠進行通訊的辦法是在網絡中唯一的標識一個進程。而在網絡中唯一的標識一個進程的方法是:標出ip地址 + 協議 + 端口號。這樣就可以利用socket進行通信了。
什么是socket?socket翻譯為套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。
socket抽象層在網絡中的位置圖解:
Socket通信流程
·
(綠色為服務器操作,純黑色為用戶操作)
服務器根據地址類型(ipv4、ipv6)、socket類型、協議創建socket
服務器為socket綁定對應的IP地址和端口號
服務器監聽端口號請求,接收用戶發來的連接請求,此時服務器沒有打開socket
· 用戶創建socket
用戶打開socket,並通過IP地址+端口號試圖connect服務器的socket
服務器接收到了用戶發來的socket連接請求,被動打開socket,開始接收客戶端請求,直到用戶返回連接信息。這時候服務器的socket進入堵塞狀態,所謂堵塞,即accept();方法一直接收到客戶端返回連接信息后才返回,然后開始接收下一個用戶端請求
客戶端連接成功,開始向服務器輸入狀態信息
服務器accept();方法返回,連接成功
客戶端寫入信息
服務器讀取信息
客戶端關閉
服務端關閉
三次握手
在TCP/IP協議中,TCP協議通過三次握手建立一個可靠的連接,就是socket通信流程中的建立socket連接部分
第一次握手:客戶端嘗試連接服務器,向服務器發送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狀態,完成三次握手