TCP的套接字

2021-08-01 11:06:30 字數 3040 閱讀 5508

摘自:《深入理解計算機網路》 王達著 機械工業出版社

1.ipv4資料報頭部格式

2.ipv6資料報頭部格式

3.ipv4資料報的封裝與解封裝

4.ipv4資料報的分段與重組

5.arp協議報文格式及arp表

6.arp位址解析原理

7.icmp協議及報文格式

8.ipv6協議族的其它協議

9.tcp的主要特性

在osi/rm的傳輸層服務時,傳輸通訊兩端的端點就是tsap位址,對應的就是傳輸層協議埠。在tcp/ip網路中,同樣有端點的概念,但它不是採用osi/rm中的tsap叫法,而是稱為「套接字(socket)」,就像在tcp中仍然把所傳輸的資料稱為「資料段」,而沒有採用osi/rm中的tpdu叫法一樣。當然,需要說明的是,socket並不能直接等於tsap,它們只是類似,實際上socket只是利用了tsap位址,因為在它所包括的一組引數中就有tsap位址——埠。「套接字」最早使用與unix作業系統,後來被廣泛地應用於windows和linux系統中,成為事實上的tcp標準。

在tcp/ip網路中,區分不同的應用程式程序間的網路通訊和連線時主要有以下3個引數:通訊的目的位址、使用的傳輸協議(tcp或udp)和使用的埠號(此處說明一下,socket不僅在tcp有,在udp同樣有)。通過將這3個引數結合起來,與乙個socket進行繫結,應用層就可以與傳輸層一起通過套接字介面區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp/ip互動提供了稱為套接字(socket)的介面。

socket可以看成是在兩個網路應用程式進行通訊連線時的乙個端點(或者稱為「邏輯介面「),它是連線應用程式和網路驅動程式的橋梁,如下圖所示。從位置上看,它與tsap是不一樣的,因為tsap是位於傳輸層上邊緣(但仍屬於傳輸層),而socket是完全位於應用層,但是它呼叫了傳輸層的埠。socket包括了tsap位址,同樣它還包括了在本章前面所介紹的服務原語,具體內容將在後面介紹。

圖1:socket介面的位置

在tcp/ip通訊中,應用程式把資料傳送給socket,然後由socket通過傳輸層向下提交給網路驅動程式並向網路上傳送出去。計算機從網路上收到與該socket繫結ip位址和埠號相關資料後,由網路驅動程式通過傳輸層向上提交給應用層的socket,最後應用程式從socket中提取所要接受的資料。通訊雙發計算機上的網路應用程式就是這樣通過socket進行資料的傳送和接受的,基本互動過程如下圖所示。

圖2:socket在tcp/ip通訊中的互動使用

從上圖可以看出,在應用層上,針對每個應用程序都有乙個socket,用來調來傳輸層的乙個特定埠(當然,這個埠對於常規服務來說是固定的,而對於非常規服務來說是不固定的)。也就是說,應用層的socket和傳輸層的埠都有很多,但位於網路層,對於一台具體的主機和具體的網路來說,它的ip位址卻是唯一的,也只有socket和埠與ip位址之間是「多對一」的關係。

在tcp socket中,包括了如下表所示的一組(供8個)tcp資料傳輸服務原語。表中前4個原語由伺服器按照順序執行(但並不是說伺服器僅呼叫這4個原語)。其中,socket原語用來建立乙個新的端點,並且在傳輸實體中為它們分配相應的空間。socket原語調用成功後,返回乙個普通檔案的檔案描述符,以便在後續其他的原語調用中使用。但由於新建立的套接字並沒有網路位址,需要通過bind原語為它進行分配,所以bind原語的用途就是為新建的套接字繫結乙個本地網路位址。

原語名稱

含義socket

建立乙個新的通訊端點

bind

講乙個本地位址關聯到套接字上

listen

通告願意接受連線,並給出佇列大小

accept

阻塞呼叫方,知道有人試圖進行連線

connect

主動嘗試建立連線

send

在指定的連線上傳送資料

recv

從指定的連線上接受資料

close

釋放指定的連線

bind原語執行後需要呼叫listen原語,它為新建的套接字分配一定的快取空間,以便讓後面要進來的連線進行排隊,這樣就可以使多個客戶可以同時對乙個伺服器進行訪問。但此時伺服器還不是阻塞狀態,也就是伺服器仍沒有進入等待連線狀態,這裡再需要呼叫乙個accept原語。當乙個請求連線的tcp資料段到來時,傳輸實體會通過呼叫accept原語建立乙個新的套接字,並返回乙個與其檔案關聯的檔案描述符。這個新的套接字與原來由socket原語建立的套接字具有相同屬性。這時,伺服器就可以呼叫乙個程序來處理這個套接字上的新的連線,而伺服器本上又回去僅需等待源套接字上的下乙個連線。

以上介紹的是由伺服器呼叫的4個原語,而在客戶端使用的原語主要包括socket、connect、send、recv。首先,有socket原語建立乙個新的套接字,但由於伺服器並不關心它所用的ip位址,所以客戶端不必呼叫bind原語。然後,通過connect原語阻塞客戶端,並主動發起乙個tcp傳輸連線。當connet原語調用完成,即收到伺服器端發來的確認資料後,客戶端解除阻塞狀態,建立傳輸連線。到此為止,雙方都可以使用send和recv原語在建立起來的全雙工連線上進行資料的接受或傳送。

伺服器和客戶端都可以呼叫close原語,用來釋放當前tcp傳輸連線。當雙方都執行了close原語後,連線才會真正的釋放。

tcp socket原語調用的基本流程如下圖所示:

tcp socket原語調用的基本流程

TCP套接字程式設計

網路程式設計又稱為套接字程式設計,為了與遠端計算機進行資料傳輸,需要連線到網際網路,而程式設計中的 套接字 就是用來連線該網路的工具。它本身具有連線的含義,還可以表示為兩台計算機之間的網路連線。4.呼叫accept函式受理連線請求 基於tcp的服務端 客戶端 tcp伺服器端預設函式呼叫順序 sock...

TCP套接字程式設計

對於socket不理解的可以檢視 c語言通過socket程式設計實現tcp通訊,linux socket程式設計 socket詳解 先看看程式效果圖 提示如果伺服器,直接通過ctrl z關閉,這樣程式占用的位址不會釋放,需要以下操作 1.ps 檢視程序 2.kill 9 程式pid 強制殺死程序 服...

TCP套接字程式設計!!!

一 socket程式設計的基本函式詳解,其中根據客戶端還是服務端,或者根據使用tcp還是udp,函式的呼叫流程有些許區別 1 socket 函式用於建立乙個套接字,一條通訊線路的端點。3 listen 在服務端程式成功建立套接字和與位址進行繫結之後,還需要準備在該套接字上接收新的連線請求。此時呼叫l...