Socket 和 TCP 有什麼聯繫?建立Socket,操作系統主要是做了哪些事?

網路通信是通過socket來實現的,而通信要遵循TCP協議(僅指使用TCP的情況)。一般看書上或者一些資料都是說操作系統要進行socket系統調用來建立和接收方的網路連接,而建立連接是要構建TCP數據包的,那就是只創建socket就是將請求內容封裝成TCP數據包嗎?還是socket還有其他更深的知識


Berkeley Sockets是操作系統提供的一套API,用來把底層網路棧的數據流包裝出一個文件描述符,這樣應用程序就可以把一個網路數據流(比如TCP連接)當作一個文件處理,即用處理的文件的read/write/close等函數處理

除了用文件I/O API來處理網路數據流,Berkeley Sockets還提供了一些額外的特製的I/O API,可以視情況選用


socket是抽象出來的使用TCP/UDP的概念模型,屏蔽掉了晦澀的底層協議的實現,是一個介面。


說說我的理解 以Linux系統為例

Linux系統在內核中已經實現了應用程序以下的協議,如TCP協議、IP協議等協議並且通過socket API 給用戶提供了編程的介面

所以作為用戶呢 就不用在寫應用程序的時候呢 就不用那麼麻煩去自己實現這些個協議了,直接調用socket提供的介面API即可。

當然, 也可以自己去組包。把用戶數據包成TCP segment,在包成IP包, 再乙太網幀,然後再發送出去,這樣做也是可以的,只是比較麻煩而已就是不如直接用API來的方便。


感覺題主的題目和問題有點對不上,不知道怎麼回答。我就按照題目回答吧。

1. Socket和TCP有什麼聯繫?

Socket其實就是IP地址和埠號的組合。TCP協議是L4協議,主要是協定埠號便於應用程序之間的互相通信。所以TCP協議決定了Socket里的一部分,另一部分IP地址由IP協議協定。

2. 操作系統主要做了哪些事?

這個問題應該分成2部分回答。Socket Server和Socket Client。

對於Socket Server,操作系統會啟動一個守護進程並在一個埠上持續監聽。比如你啟動一個HTTP Server,那麼埠號默認80。啟動FTP Server 那麼默認埠號就是21。

對於Socket Client,操作系統會隨機分配一個埠,一般是10000以上。

Client和Server之間如何建立連接?

Client發送SYN到Server,此時Server已經知道了Client的埠號。

Server發送ACK SYN到Client。此時Client確認Server上指定埠有進程監聽,並確認能處理請求。

Client發送ACK給Server。此時Server已經確認了Client已經收到了ACK SYN。可以開始通信。

這就是著名的三次握手。


一圖勝千言!

圖片引用自:《TCP/IP ARCHITECTURE, DESIGN, AND IMPLEMENTATION IN LINUX》

針對問題,簡單補充幾點:

1. 當討論socket與tcp之間的關係時,這裡具體應該指的是"struct socket"與"struct sock或struct tcp_sock"之間的關係,而不是API socket()與TCP之間的關係。

2. 從struct inode的i_sock標記位來看,如果把BSD socket理解成一種特殊的inode也不為過。當然,這個說法僅限於我熟悉Linux系統,對於其他操作系統不做討論。

補充:在最新的Linux源碼中,struct inode相關變數名稱已經與圖中i_sock等不相同了,不過這並不影響理解邏輯關係。

一般看書上或者一些資料都是說操作系統要進行socket系統調用來建立和接收方的網路連接,而建立連接是要構建TCP數據包的,那就是只創建socket就是將請求內容封裝成TCP數據包嗎?

針對題主的上面這段話的描述,也稍微糾正一下:

  • 調用socket系統調用,並不會建立和接收方的網路連接!
    • 調用socket(),系統會建立一個文件(struct file)、一個BSD socket (struct socket)和一個指定協議類型的"struct sock"。並且會將三者用如圖所示方式建立對應關係,此時的socket state是SS_UNCONNECTED。
    • 至於建立連接的事情,是bind()+listen()+accept()或connect()的事情。


socket這個概念,可以從其英文含義去理解:插座。

電力公司給你家送電,是通過電線,電線上流的電流,電流還是正弦波的,你可以把這些理解為OSI的多層協議。但是電送到你家還不夠,你家得有個插座(socket),這樣你的電器才能用上電。

插座上有火線/地線/中線,你可以對應理解為ip地址/埠地址等等。


我個人的理解是socket是一個真實存在,但沒有被納入OSI模型的層,裡面保存了目的和源埠,這個層是TCP和UDP都會用到的


just an api, call it.


推薦閱讀:

TCP 協議下 socket 有可能丟包嗎?
誰能幫我系統的講解下TCP/IP,HTTP,Socket,Servlet,他們之間的邏輯關係,系統點?
多線程網路程序有什麼好的調試方法?
如何思考並解決網路編程中的問題?
windows 利用socket實現從http下載?

TAG:UDP | 計算機網路 | Socket | TCP |