操作系統是如何將socket接受的數據發送給應用層的?

亦沉兮


在正篇開始之前,我先提問幾個問題,不知道你是否全都瞭解:

(1) 網絡請求是通過http發送的嗎?

(2) http與tcp之間的關係?

(3) 網絡請求是怎麼發送的,通過什麼形式去發送的?

在過往對於http與tcp的理解其實只是一個簡單模糊的概念,仔細想想其實http只是一種協議,tcp只是用於建立一個持久連接,它們都不是用於網絡發送數據的根本,真正發送數據的是我們的物理層,http協議只是作為一個標識的作用,簡單來說是定位到某一主機。

下面來介紹一下計算機網絡體系結構

計算機網絡分為7層,分別是物理層,數據鏈路層,網絡層,傳輸層,會話層,表示層以及應用層,由於7層太多所以後面經過演變之後定為5層,把應用層,會話層,表示層給合統稱為應用層,我們客戶端的每一步操作,舉個例子,當我們點擊發送按鈕請求網絡的時候,這時候會通過應用層逐漸往下傳遞直到物理層,物理層會提供一個互聯網網絡接口,這時候才真正通過互聯網開始傳輸數據,這裡最主要介紹的是傳輸層以及物理層,其它的百度一下,傳輸層是第一個端到端的層次,也是進程——進程的層次。

主要功能是實現端到端的可靠數據傳輸、複用與分解、連接控制、流量控制和擁塞控制(這些東西都是定義去百度一下,比如說流量控制,其實就是控制數據的發送量,你不能一次性發送很多數據,原因想一下就知道了),客戶端的每一步操作都會在這5層體現出來,查下定義之後就會一目瞭然(比如說在我們終止會話,這時候就是由會話層管理,實體間交換數據的語法,解決格式和數據表示的差別是由表示層來完成等),在我們建立連接的時候比如說發送一個http請求(原理跟後面的socket數據傳輸模塊是一樣的),我們會先建立一個tcp連接,然後發送http請求,這時候數據會經過傳輸層,傳輸層裡攜帶了發送數據的報文(比如ip地址,端口號之類的,數據內容),向下傳遞到物理層,物理層最後會提供一個互聯網網絡接口去發送數據,數據是以比特流的形式發送,發送到交換機上面(交換機是什麼,去百度查一下,不做解釋),交換機是有多個的,當我們數據非常大的時候,數據會被分解發送到多個交換機上面,傳到對方客戶端或者服務器的時候數據會重新整合起來,上面的是一個簡單的http請求,下面來介紹一下Socket。

1.Socket的整體流程:

udp客戶端:創建套接字,發送數據,接收數據,關閉套接字。

udp服務端:創建套接字,綁定地址和端口號,接收數據,發送數據,關閉套接字。

tcp客戶端:創建套接字,建立連接,發送數據,接收數據,關閉套接字。

tcp服務端:創建套接字,綁定地址和端口號,設置監聽,建立連接,發送數據,接收數據,關閉套接字。

這些理解起來很容易,我們客戶端是要發送數據的,服務端需要接收數據,所以服務端要綁定地址和端口號,而tcp是需要三次握手的所以要有監聽。

2.Socket三次握手

第一次握手,客戶端發送請求給服務端(詢問是否可以建立連接)。

第二次捂手,服務端回應給客戶端一個確認,接受連接或者拒絕連接

第三次握手,經過確認之後,客戶端回應給服務端(意思是我要開始發送數據了,下一步就開始發送了)。

理解三次握手,為什麼要三次,第一次握手確認客戶端可以發送請求,第二次握手確認服務端可以接收並且發送,第三部確認客戶端可以接收。

3.Scoket四次揮手

第一次揮手,客戶端向服務器發送斷開連接請求

第二次揮手,服務端回應客戶端(意思是,稍等等我數據傳完(處理完的意思),在斷開)

第三次揮手,服務端回應客戶端斷開請求(可以斷開了)

第四次揮手,客戶端與服務端請求斷開。

tcp連接是面向連接的,數據發送可靠,udp是面向無連接的,數據發送過後就不管了,下面介紹一下tcp為什麼數據可靠

具體方法如下:

差錯檢測:我們發送數據的時候剛剛說過是由物理層提供的互聯網網絡接口以比特流的形式進行發送,那麼這個時候差錯檢測利用差錯編碼實現數據包傳輸過程中的比特差錯檢測,保證數據正確性

確認:接收方向發送方反饋接收狀態。ACK(肯定確認);NAK(否定確認)

重傳:當沒有接收到反饋狀態。ACK(肯定確認);NAK(否定確認)的時候,或者請求超時的時候進行重新發送

計時器:內部檢測,一個定時器,當數據在一定時間沒有接收到確認的時候就認為發送失敗,進行重傳操作。

序號:剛剛說了重傳有兩種情況,那麼當重傳是因為網絡超時引起的,那麼這個時候計時器進行了一次重傳,然後上次超時後並沒有發送失敗這個時候也發送成功了,這個時候就會造成數據錯亂,那麼序號就起了一個作用,就是給數據進行排序,以至於不錯亂。

下面來說一下tcp可靠傳輸協議滑動窗口協議

左邊的代表的是接收的數據,中間代表的是正在處理的,右邊代表的是沒有處理的,在我們發送數據的時候比如56789這些數據發送,56成功了,這時候窗口就會往右移動,接收的時候呢,當我們接收比如56,接收成功了,這時候窗口往右移動,這裡有一個需要注意一下,比如說當我們5沒有發送成功或者說5沒有接收成功,而6發送成功了,這時候窗口是不會往右移動的,它會等待5發送成功後在往右移動,浮動窗口協議裡還有GBN協議和SR協議,這兩個的主要區別是,GBN協議的發送窗口只能發送一個,比如上面中間準備發送的5678就只能存在5一個,但是接收窗口是可以有多個的,SR協議是可以發送窗口與接收窗口都是可以多個的。

最後總結一下http請求與socket的差異,socket是套接字,用於將報文傳輸到傳輸層,http請求在發送的時候會建立tcp連接,所以http也會分為http持久性連接和非持久性連接,至於網絡傳輸都是要經過物理層才能傳輸,數據經過多個交換機進行分解,傳到服務器的時候在進行整合。


stormsha


網卡接收到數據根據數據頭,將數據寫到對應的內存,併發出中斷,系統接收到中斷,然後通知應用吧?


我曾經跨過山河大海78782211


VC中客戶端socket與服務器連接後,需要執行一個封狀的操作

朝服務器發送一些數據(命令),然後返回結果

假設全部才字符串,類似這樣的函數

CString SendCommand (CString cmd,socket sk)

要求在執行這個函數的時候能同時響應用戶界面操作

也就是要用異步方式

而且這個socket已經建立好,有RecvTheard在處理

我目前是用Event實現的,很彆扭:

m_hevtReadStore=CreateEvent(NULL,false,FALSE,NULL);

//m_tcp是封裝的socket基本操作類


分享到:


相關文章: