日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么是套接字?Socket基本介绍

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是套接字?Socket基本介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是套接字?Socket基本介紹

  • 一、什么是套接字?
  • 二、套接字特性
  • 三、套接字緩沖區

一、什么是套接字?

套接字是一種通信機制(通信的兩方的一種約定),socket屏蔽了各個協議的通信細節,提供了tcp/ip協議的抽象,對外提供了一套接口,同過這個接口就可以統一、方便的使用tcp/ip協議的功能。這使得程序員無需關注協議本身,直接使用socket提供的接口來進行互聯的不同主機間的進程的通信。我們可以用套接字中的相關函數來完成通信過程。

發送方的發送數據的處理流程大致為:用戶空間 -> 內核 -> 網卡 -> 網絡

在用戶態空間,調用發送數據接口 send/sento/wirte 等寫數據包,在內核空間會根據不同的協議走不同的流程。以TCP為例,TCP是一種流協議,內核只是將數據包追加到套接字的發送隊列中,真正發送數據的時刻,則是由TCP協議來控制的。TCP協議處理完成之后會交給IP協議繼續處理,最后會調用網卡的發送函數,將數據包發送到網卡。

接收方的接收數據的處理流程大致為:網絡 -> 網卡 -> 內核(epoll等) -> 進程(業務處理邏輯)

網卡會通過輪詢或通知的方式接收數據,Linux做了優化,組合了通知和輪詢的機制,簡單來說,在CPU響應網卡中斷時,不再僅僅是處理一個數據包就退出,而是使用輪詢的方式繼續嘗試處理新數據包,直到沒有新數據包到來,或者達到設置的一次中斷最多處理的數據包個數。數據離開網卡驅動之后就進入到了協議棧,經過IP層、網絡層協議的處理,就會觸發IO讀事件,比如epoll的reactor模型中,就會觸發對應的讀事件,然后回調對應的IO處理函數,數據之后會交給業務線程來處理,比如Netty的數據接收處理流程就是這樣的。

二、套接字特性

套接字的特性有三個屬性確定,它們是:域(domain),類型(type),和協議(protocol)。
:指定套接字通信中使用的網絡介質。最常見的套接字域是 AF_INET(IPv4)或者AF_INET6(IPV6),它是指 Internet 網絡。
類型:

  • 流套接字(SOCK_STREAM):
    流套接字用于提供面向連接、可靠的數據傳輸服務。該服務將保證數據能夠實現無差錯、無重復發送,并按順序接收。流套接字之所以能夠實現可靠的數據服務,原因在于其使用了傳輸控制協議,即TCP
  • 數據報套接字(SOCK_DGRAM):
    數據報套接字提供了一種無連接的服務。該服務并不能保證數據傳輸的可靠性,數據有可能在傳輸過程中丟失或出現數據重復,且無法保證順序地接收到數據。數據報套接字使用UDP(User Datagram Protocol)協議進行數據的傳輸。
  • 原始套接字(SOCK_RAW):
    原始套接字與標準套接字(標準套接字指的是前面介紹的流套接字和數據報套接字)的區別在于:原始套接字可以讀寫內核沒有處理的IP數據包,而流套接字只能讀取TCP協議的數據,數據報套接字只能讀取UDP協議的數據。因此,如果要訪問其他協議發送數據必須使用原始套接字。

協議:IPPROTO_TCP,IPPROTO_UDP

三、套接字緩沖區

每個 socket 被創建后,都會分配兩個緩沖區,輸入緩沖區和輸出緩沖區。write()/send() 并不立即向網絡中傳輸數據,而是先將數據寫入緩沖區中,再由TCP協議將數據從緩沖區發送到目標機器。一旦將數據寫入到緩沖區,函數就可以成功返回,不管它們有沒有到達目標機器,也不管它們何時被發送到網絡,這些都是TCP協議負責的事情。read()/recv() 函數也是如此,也從輸入緩沖區中讀取數據,而不是直接從網絡中讀取。

用戶程序緩沖區
用戶進程通過系統調用訪問系統資源的時候,需要切換到內核態,而這對應一些特殊的堆棧和內存環境,必須在系統調用前建立好。而在系統調用結束后,cpu會從核心模式切回到用戶模式,而堆棧又必須恢復成用戶進程的上下文。而這種切換就會有大量的耗時。
一些程序在讀取文件時,會先申請一塊內存數組,稱為buffer,然后每次調用read,讀取設定字節長度的數據,寫入buffer(用較小的次數填滿buffer)。之后的程序都是從buffer中獲取數據,當buffer使用完后,在進行下一次調用,填充buffer。所以說:用戶緩沖區的目的是為了減少系統調用次數,從而降低操作系統在用戶態與核心態切換所耗費的時間。除了在進程中設計緩沖區,內核也有自己的緩沖區。
內核緩沖區
當一個用戶進程要從磁盤讀取數據時,內核一般不直接讀磁盤,而是將內核緩沖區中的數據復制到進程緩沖區中。但若是內核緩沖區中沒有數據,內核會把對數據塊的請求,加入到請求隊列,然后把進程掛起,為其它進程提供服務。等到數據已經讀取到內核緩沖區時,把內核緩沖區中的數據讀取到用戶進程中,才會通知進程。
你可以認為,read是把數據從內核緩沖區復制到進程緩沖區。write是把進程緩沖區復制到內核緩沖區。當然,write并不一定導致內核的寫動作,比如os可能會把內核緩沖區的數據積累到一定量后,再一次寫入。這也就是為什么斷電有時會導致數據丟失。所以說內核緩沖區,是為了在OS級別,提高磁盤IO效率,優化磁盤寫操作。

總結

以上是生活随笔為你收集整理的什么是套接字?Socket基本介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。