『壹』 操作系統是如何將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持久性連接和非持久性連接,至於網路傳輸都是要經過物理層才能傳輸,數據經過多個交換機進行分解,傳到伺服器的時候在進行整合。
網卡接收到數據根據數據頭,將數據寫到對應的內存,並發出中斷,系統接收到中斷,然後通知應用吧?
VC中客戶端socket與伺服器連接後,需要執行一個封狀的操作
朝伺服器發送一些數據(命令),然後返回結果
假設全部才字元串,類似這樣的函數
CString SendCommand (CString cmd,socket sk)
要求在執行這個函數的時候能同時響應用戶界面操作
也就是要用非同步方式
而且這個socket已經建立好,有RecvTheard在處理
我目前是用Event實現的,很別扭:
m_hevtReadStore=CreateEvent(NULL,false,FALSE,NULL);
//m_tcp是封裝的socket基本操作類
『貳』 TCP/IP和Socket 是什麼關系啊
TCP協議是可靠的傳輸協議,TCP在通訊前需要先進過三次握手建立連接,而Socket就代表這個連接,由埠號+iP地址組成
『叄』 socket通信原理
socket通信原理是一種「打開—讀/寫—關閉」模式的實現,伺服器和客戶端各自維護一個「文件」,在建立連接打開後,可以棚氏向文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。
Socket在應用層和傳輸層之間的一個抽象層,它把 TCP/IP 層復雜的操作抽象為幾個簡單的介面,供應用層調用實現進程在網路中的通信。Socket 起源於 UNIX,在 UNIX 一切皆文件的思想下,進程間通信就被冠名為文件描述符(file descriptor)。
Socket 保證了不同計算機之間的通信,也就是網路通信。對於網站,通信模型是伺服器與客戶端之間的通信。兩端都建立了一個 Socket 對象,然後通過 Socket 對象對數據進行傳輸。通常鏈遲散伺服器處於一個無限循環,等待客戶端的連接。
(3)計算機網路原理socket擴展閱讀
SOCK_STREAM類型的套介面為全雙向的位元組流。對於流類套介面,在接收或發送數據前必需處於已連接狀態。用connect()調用建立與另一套介面的連接,連接成功後,即可用send()和recv()傳送數據。當會話結束後,調用closesocket()。帶外數據根據規定用send()和recv()來接收。
實現SOCK_STREAM類型套介面的通訊協議保證數據不會丟失也不會重復。如果終端協議有緩沖區空間,且數據不能在一定時間成功發送旦襪,則認為連接中斷,其後續的調用也將以WSAETIMEOUT錯誤返回。
SOCK_DGRAM類型套介面允許使用sendto()和recvfrom()從任意埠發送或接收數據報。如果這樣一個套介面用connect()與一個指定埠連接,則可用send()和recv()與該埠進行數據報的發送與接收。
『肆』 socket是什麼呀
套接字(Socket),就是對網路中不同主機上的應用進程之間進行雙向通信的端點的抽象。
一個套接字就是網路上進程通信的一端,提供了應用層進程利用網路協議交換數據的機制。從所處的地位來講,套接字上聯應用進程,下聯網路協議棧,是應用程序通過網路協議進行通信的介面,是應用程序與網路協議根進行交互的介面。
套接字是通信的基石,是支持TCP/IP協議的路通信的基本操作單元。
可以將套接字看作不同主機間的進程進行雙間通信的端點,它構成了單個主機內及整個網路間的編程界面。套接字存在於通信域中,通信域是為了處理一般的線程通過套接字通信而引進的一種抽象概念。
套接字通常和同一個域中的套接字交換數據(數據交換也可能穿越域的界限,但這時一定要執行某種解釋程序),各種進程使用這個相同的域互相之間用Internet協議簇來進行通信。
Socket(套接字)可以看成是兩個網路應用程序進行通信時,各自通信連接中的端點,這是一個邏輯上的概念。它是網路環境中進程間通信的API(應用程序編程介面),也是可以被命名和定址的通信端點,使用中的每一個套接字都有其類型和一個與之相連進程。
通信時其中一個網路應用程序將要傳輸的一段信息寫入它所在主機的 Socket中,該 Socket通過與網路介面卡(NIC)相連的傳輸介質將這段信息送到另外一台主機的 Socket中,使對方能夠接收到這段信息。
Socket是由IP地址和埠結合的,提供向應用層進程傳送數據包的機制。
類型
1、數據報套接字
無連接套接字,使用用戶數據報協議(UDP)。在數據報套接字上發送或接收的每個數據包都單獨定址和路由。數據報套接字不能保證順序和可靠性,因此從一台機器或進程發送到另一台機器或進程的多個數據包可能以任何順序到達或可能根本不到達。在數據報套接字上發送廣播可能需要特殊配置。
為了接收廣播數據包,數據報套接字不應該綁定到特定地址,盡管在某些實現中,當數據報套接字綁定到特定地址時也可能接收廣播數據包。
2、流套接字
面向連接的套接字,使用傳輸控制協議(TCP)、流控制傳輸協議(SCTP) 或數據報擁塞控制協議(DCCP)。流套接字提供了無記錄邊界的有序且獨特的無錯誤數據流,並具有用於創建和銷毀連接以及報告錯誤的明確定義的機制。
流套接字以帶外功能可靠地、有序地傳輸數據。在 Internet 上,流套接字通常使用 TCP 實現,以便應用程序可以使用 TCP/IP 協議在任何網路上運行。
3、原始套接字
允許直接發送和接收 IP 數據包,無需任何特定於協議的傳輸層格式。對於其他類型的套接字,根據選擇的傳輸層協議(例如 TCP、UDP)自動封裝有效載荷,並且套接字用戶不知道與有效載荷一起廣播的協議頭的存在。從原始套接字讀取時,通常包含標頭。
從原始套接字傳輸數據包時,自動添加標頭是可選的。
大多數套接字應用程序編程介面(API),例如基於Berkeley 套接字的那些,支持原始套接字。Windows XP於 2001 年發布,在Winsock介面中實現了原始套接字支持,但三年後,微軟出於安全考慮限制了 Winsock 的原始套接字支持。
原始套接字用於與安全相關的應用程序,如Nmap。原始套接字的一個用例是在用戶空間中實現新的傳輸層協議。
原始套接字通常在網路設備中可用,用於路由協議,例如Internet 組管理協議(IGMP) 和開放最短路徑優先(OSPF),以及用於Internet 控制消息協議(ICMP) 等事情,由ping 實用程序。
以上內容參考網路-套接字