天津河?xùn)|區(qū)網(wǎng)站建設(shè)持續(xù)優(yōu)化完善防控措施
目錄
URL
HTTP(超文本傳輸協(xié)議)
FTP(文件傳輸協(xié)議)
File
mailto
HTTP的方法
Socket
URL
- URL(Uniform Resource Locator)中文名為統(tǒng)一資源定位符,
- 它是互聯(lián)網(wǎng)上用來標(biāo)識某一資源的地址。
- 就像是現(xiàn)實生活中家庭住址一樣,
- 通過這個地址可以準(zhǔn)確地找到對應(yīng)的資源,
- 比如一個網(wǎng)頁、一張圖片、一個文件等。
HTTP(超文本傳輸協(xié)議)
? ? HTTP 是用于傳輸超媒體文檔(例如 HTML)的應(yīng)用層協(xié)議。
? ? 例如, “http://example.com”
FTP(文件傳輸協(xié)議)
? ? FTP 主要用于在網(wǎng)絡(luò)上進(jìn)行文件的上傳和下載。
File
? ? “file” 協(xié)議主要用于訪問本地計算機(jī)上的文件。
? ? 例如,“file:///C:/Users/Documents/report.html”</span>
mailto
? ? “mailto” 是一種用于啟動電子郵件客戶端并創(chuàng)建新郵件的協(xié)議。
? ? 如 “mailto:someone@example.com”
HTTP的方法
GET: 訪問Web服務(wù)器獲取網(wǎng)頁數(shù)據(jù)
POST:在表單中填寫數(shù)據(jù)并發(fā)給服務(wù)器
PUT:替換服務(wù)器上的文件
DELETE:刪除服務(wù)器上的文件
打開有一個圖片和很多文字的網(wǎng)頁.
瀏覽器向網(wǎng)頁服務(wù)器請求數(shù)據(jù),
服務(wù)器返回數(shù)據(jù),
然后會在請求一次圖片的數(shù)據(jù),
瀏覽器再返回圖片的數(shù)據(jù)
IP地址:
互聯(lián)網(wǎng)協(xié)議地址,用于在網(wǎng)絡(luò)環(huán)境中識別和定位這些設(shè)備
好像是現(xiàn)實生活中每棟房子都有一個獨(dú)一無二的門牌號一樣
Pv4 地址由 32 位二進(jìn)制數(shù)組成
例如,“192.168.1.1”
IPv6由 128 位二進(jìn)制數(shù)組成
例如,“2001:0db8:85a3:0000:0000:8a2e:0370:7334”
分類:
A類 例如,10.0.0.0 - 10.255.255.255 常用于大型企業(yè)內(nèi)部網(wǎng)絡(luò)
B類 例如,172.16.0.0 - 172.31.255.255 一些高?;蛘咧行推髽I(yè)的園區(qū)網(wǎng)絡(luò)可能會使用
C類 例如,192.168.1.0 - 192.168.1.255 ?家庭中的無線路由器通常會設(shè)備分配 C 類地址
D類 D 類地址的第一個字節(jié)范圍是 224 - 239,它主要用于多播(組播)通信。
E類 E 類地址的第一個字節(jié)范圍是 240 - 255,它是保留地址主要用于實驗和研究目的。
DNS:
它就像是一個巨大的電話簿,
將人們?nèi)菀子洃浀挠蛎?#xff08;如baidu.com)
和計算機(jī)在網(wǎng)絡(luò)中實際使用的 IP 地址(如 14.215.177.38)
相互映射起來。
DNS 是一個分層的分布式數(shù)據(jù)庫系統(tǒng)。
它的最頂層是根域名服務(wù)器,
全球共有 13 組根域名服務(wù)器(用字母 A - M 表示)
當(dāng)用戶在瀏覽器中輸入一個域名時,首先會向本地 DNS 服務(wù)器
(通常由互聯(lián)網(wǎng)服務(wù)提供商提供)發(fā)送查詢請求。
本地 DNS 服務(wù)器會先查看自己的緩存,
如果緩存中有該域名對應(yīng)的 IP 地址,
就直接返回給瀏覽器。如果緩存中沒有,
本地 DNS 服務(wù)器會向根域名服務(wù)器發(fā)送請求
,根域名服務(wù)器會告訴它應(yīng)該去詢問哪個頂級域名服務(wù)器。
然后本地 DNS 服務(wù)器向頂級域名服務(wù)器發(fā)送請求,
頂級域名服務(wù)器再引導(dǎo)它向二級域名服務(wù)器等更低級別的域名服務(wù)器詢問,
直到找到該域名對應(yīng)的 IP 地址,
并將其返回給瀏覽器。
-
用戶輸入網(wǎng)址
-
域名解析
- 查詢?yōu)g覽器緩存
- 向本地 DNS 服務(wù)器查詢:
- DNS 服務(wù)器查詢過程:
- 本地 DNS 緩存查詢:如果緩存中有該域名對應(yīng)的 IP 地址,就直接將結(jié)果返回給瀏覽器。
- 遞歸查詢(如果緩存沒有):引導(dǎo)本地 DNS 服務(wù)器向更下一級的域名服務(wù)器查詢,直到找到域名對應(yīng)的 IP 地址。
- 返回 IP 地址給瀏覽器:最后,本地 DNS 服務(wù)器將查詢到的 IP 地址返回給瀏覽器。
建立連接
-
- 確定通信協(xié)議:瀏覽器根據(jù)網(wǎng)址中的協(xié)議部分(如 http 或 https)來確定要使用的通信協(xié)議。還需要進(jìn)行 SSL/TLS 加密協(xié)議的握手過程。
- TCP 三次握手(以 HTTP 為例):
- 第一次握手:瀏覽器向服務(wù)器發(fā)送一個 SYN(同步)數(shù)據(jù)包,其中包含一個隨機(jī)生成的序列號。這個序列號用于后續(xù)的數(shù)據(jù)傳輸順序和確認(rèn)。
- 第二次握手:服務(wù)器收到 SYN 數(shù)據(jù)包后,會返回一個 SYN - ACK(同步 - 確認(rèn))數(shù)據(jù)包。這個數(shù)據(jù)包中包含服務(wù)器自己生成的序列號,同時確認(rèn)瀏覽器發(fā)送的序列號。
- 第三次握手:瀏覽器收到 SYN - ACK 數(shù)據(jù)包后,會發(fā)送一個 ACK(確認(rèn))數(shù)據(jù)包,確認(rèn)服務(wù)器發(fā)送的序列號。通過這三次握手,瀏覽器和服務(wù)器之間建立了一個可靠的 TCP 連接,可以進(jìn)行數(shù)據(jù)傳輸。
發(fā)送 HTTP 請求
-
- 構(gòu)建請求報文:瀏覽器根據(jù)用戶輸入的網(wǎng)址和要獲取的資源類型(如網(wǎng)頁、圖片、腳本等)構(gòu)建 HTTP 請求報文。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 請求報文包括請求行(包含請求方法,如 GET 用于獲取資源;請求的 URL 路徑;HTTP 協(xié)議版本)、? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 請求頭部(包含如 User - Agent,表示瀏覽器的類型和版本;Accept,表示瀏覽器可以接受的內(nèi)容類型等信息)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 和請求體(對于某些請求方法,如 POST,會包含要發(fā)送的數(shù)據(jù))。
- 發(fā)送請求:瀏覽器通過已經(jīng)建立的 TCP 連接將請求報文發(fā)送給服務(wù)器。
服務(wù)器處理請求并返回響應(yīng)
-
- 服務(wù)器接收請求:服務(wù)器的網(wǎng)絡(luò)接口接收瀏覽器發(fā)送的請求報文,并將其傳遞給服務(wù)器軟件(如 Apache、Nginx 等)進(jìn)行處理。
- 處理請求:服務(wù)器軟件根據(jù)請求報文中的 URL 路徑和請求方法來查找對應(yīng)的資源。
- 構(gòu)建響應(yīng)報文:服務(wù)器將找到的資源(或動態(tài)生成的內(nèi)容)構(gòu)建成響應(yīng)報文。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 響應(yīng)報文包括響應(yīng)行(包含 HTTP 協(xié)議版本;響應(yīng)狀態(tài)碼,如 200 表示成功,404 表示未找到資源等;響應(yīng)狀態(tài)短語)、? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?響應(yīng)頭部(包含如 Content - Type,表示響應(yīng)內(nèi)容的類型;Content - Length,表示響應(yīng)內(nèi)容的長度等信息)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 和響應(yīng)體(包含實際的資源內(nèi)容)。
- 發(fā)送響應(yīng):服務(wù)器通過 TCP 連接將響應(yīng)報文發(fā)送回瀏覽器。
瀏覽器接收并處理響應(yīng)
-
- 接收響應(yīng):瀏覽器通過 TCP 連接接收服務(wù)器發(fā)送的響應(yīng)報文。
- 解析響應(yīng):瀏覽器首先查看響應(yīng)狀態(tài)碼,判斷請求是否成功。如果狀態(tài)碼是 200,表示成功獲取資源,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?瀏覽器會根據(jù)響應(yīng)頭部中的 Content - Type 來確定如何處理響應(yīng)體中的內(nèi)容。例如,如果是 “text/html”,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 瀏覽器會解析 HTML 內(nèi)容;如果是 “image/jpeg”,會顯示圖片等。
- 渲染網(wǎng)頁(如果是 HTML):
- 解析 HTML:瀏覽器開始解析 HTML 內(nèi)容,構(gòu)建 DOM(文檔對象模型)樹。它會識別 HTML 標(biāo)簽,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 將標(biāo)簽轉(zhuǎn)換為 DOM 節(jié)點(diǎn),并確定它們之間的層次關(guān)系。
- 加載外部資源:瀏覽器在解析 HTML 時,會發(fā)現(xiàn)一些標(biāo)簽用于引用外部資源,如
<link>
標(biāo)簽用于? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 引用 CSS 樣式表,<script>
標(biāo)簽用于引用 JavaScript 腳本,<img>
標(biāo)簽用于引用圖片等。瀏覽器? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?會根據(jù)這些標(biāo)簽的屬性(如 src 屬性用于指定資源的位置)發(fā)送新的請求來獲取這些外部資源。 - 渲染頁面布局和樣式:瀏覽器結(jié)合 DOM 樹和獲取到的 CSS 樣式表來確定頁面的布局和樣式。它會計算? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?每個元素的位置、大小等屬性,并將它們繪制到屏幕上。
- 執(zhí)行 JavaScript:對于加載的 JavaScript 腳本,瀏覽器會執(zhí)行它們。JavaScript 可以用于操作 DOM 樹,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?實現(xiàn)動態(tài)效果,如添加、刪除或修改網(wǎng)頁元素;也可以用于發(fā)送異步請求(如 AJAX 請求)來獲取新的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數(shù)據(jù)并更新頁面等。
Socket
- Socket(套接字)是一種在網(wǎng)絡(luò)編程中用于實現(xiàn)進(jìn)程間通信(IPC)的機(jī)制,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 它提供了應(yīng)用程序和網(wǎng)絡(luò)協(xié)議棧之間的接口??梢园?Socket 想象成一個電話插孔,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不同的應(yīng)用程序(就像不同的電話)通過這個插孔與網(wǎng)絡(luò)(電話線網(wǎng)絡(luò))進(jìn)行通信。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 它使得應(yīng)用程序能夠在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù),無論是在本地網(wǎng)絡(luò)還是互聯(lián)網(wǎng)環(huán)境中。
建立 Socket 連接的過程(以 TCP 為例)
服務(wù)器端操作
- 創(chuàng)建 Socket 對象:服務(wù)器首先需要創(chuàng)建一個 Socket 對象。在編程語言中,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 通常會調(diào)用相關(guān)的 Socket 庫函數(shù)來完成這一操作。例如,在 Python 中,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 可以使用
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
來創(chuàng)建一個 TCP Socket。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這里AF_INET
表示使用 IPv4 地址族,SOCK_STREAM
表示使用 TCP 協(xié)議。這個操作相當(dāng)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 于在服務(wù)器端準(zhǔn)備了一個通信端點(diǎn),等待客戶端來連接。 - 綁定地址和端口:創(chuàng)建 Socket 后,服務(wù)器需要將這個 Socket 綁定到一個特定的 IP 地址和端口號上。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?IP 地址用于在網(wǎng)絡(luò)中定位服務(wù)器,端口號則用于區(qū)分不同的服務(wù)。例如,Web 服務(wù)器通常使用端口 80(HTTP)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 或 443(HTTPS)。在 Python 中,可以使用
bind((host, port))
方法來實現(xiàn)綁定,其中host
是服務(wù)器的 IP 地址? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?port
是端口號。這一步就好比給電話插孔分配一個唯一的電話號碼,使得客戶端能夠找到這個服務(wù)器。 - 監(jiān)聽連接請求:綁定完成后,服務(wù)器開始監(jiān)聽來自客戶端的連接請求。這通過調(diào)用
listen()
函數(shù)來實現(xiàn),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?它會將服務(wù)器的 Socket 設(shè)置為監(jiān)聽狀態(tài),等待客戶端的連接。在這個階段,服務(wù)器就像一個電話總機(jī),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?等待著來電(客戶端連接請求)
客戶端操作
-
- 創(chuàng)建 Socket 對象:客戶端同樣需要創(chuàng)建一個 Socket 對象,方式與服務(wù)器類似。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 例如,在 Python 中也是使用
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?來創(chuàng)建一個 TCP Socket,用于與服務(wù)器進(jìn)行通信。這相當(dāng)于客戶端準(zhǔn)備好自己的電話,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?以便撥打服務(wù)器的 “電話”。 - 發(fā)起連接請求:客戶端創(chuàng)建 Socket 后,使用
connect((server_host, server_port))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 方法向服務(wù)器發(fā)起連接請求。這里server_host
是服務(wù)器的 IP 地址,server_port
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 是服務(wù)器監(jiān)聽的端口號。這個過程就像客戶端撥打服務(wù)器的 “電話號碼”,嘗試建立通信連接。
- 創(chuàng)建 Socket 對象:客戶端同樣需要創(chuàng)建一個 Socket 對象,方式與服務(wù)器類似。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 例如,在 Python 中也是使用
三次握手過程(TCP 連接建立)
-
- 第一次握手:客戶端向服務(wù)器發(fā)送一個 SYN(同步)數(shù)據(jù)包。這個數(shù)據(jù)包中包含一個隨機(jī)生成的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 初始序列號(Sequence Number),用于后續(xù)的數(shù)據(jù)傳輸順序和確認(rèn)。例如,假設(shè)客戶端生成的序列號為
x
,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這個 SYN 數(shù)據(jù)包就像是客戶端向服務(wù)器發(fā)出的 “我想和你建立連接,我的初始序列號是x
” 的信號。 - 第二次握手:服務(wù)器收到客戶端的 SYN 數(shù)據(jù)包后,會向客戶端返回一個 SYN - ACK(同步 - 確認(rèn))數(shù)據(jù)包。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這個數(shù)據(jù)包包含兩個重要信息:一是服務(wù)器自己生成的初始序列號(假設(shè)為
y
),二是對客戶端發(fā)送的序列號x
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 的確認(rèn)(ACK = x + 1
)。這相當(dāng)于服務(wù)器回復(fù)客戶端 “我收到你的連接請求了,我的初始序列號是y
,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?我確認(rèn)收到你的序列號x
,現(xiàn)在我們可以開始通信了”。 - 第三次握手:客戶端收到服務(wù)器的 SYN - ACK 數(shù)據(jù)包后,會發(fā)送一個 ACK(確認(rèn))數(shù)據(jù)包給服務(wù)器。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這個 ACK 數(shù)據(jù)包中的確認(rèn)號是
y + 1
,用于確認(rèn)收到服務(wù)器的序列號y
。通過這三次握手,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?客戶端和服務(wù)器之間就建立了一個可靠的 TCP 連接,就像雙方通過電話建立了穩(wěn)定的通話通道,可以開始進(jìn)行數(shù)據(jù)傳輸了。
- 第一次握手:客戶端向服務(wù)器發(fā)送一個 SYN(同步)數(shù)據(jù)包。這個數(shù)據(jù)包中包含一個隨機(jī)生成的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 初始序列號(Sequence Number),用于后續(xù)的數(shù)據(jù)傳輸順序和確認(rèn)。例如,假設(shè)客戶端生成的序列號為
數(shù)據(jù)傳輸階段
-
- 發(fā)送數(shù)據(jù):連接建立后,無論是客戶端還是服務(wù)器都可以通過已經(jīng)建立的 Socket 發(fā)送數(shù)據(jù)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?在編程中,通常使用
send()
或write()
函數(shù)來發(fā)送數(shù)據(jù)。例如,在 Python 中,客戶端? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?可以使用socket.send(data)
將數(shù)據(jù)data
發(fā)送給服務(wù)器。數(shù)據(jù)會被網(wǎng)絡(luò)協(xié)議棧分割成? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 合適大小的數(shù)據(jù)包,并添加 TCP 頭部(包括序列號、確認(rèn)號等信息),然后通過網(wǎng)絡(luò)發(fā)送給對方。 - 接收數(shù)據(jù):對方(服務(wù)器或客戶端)使用
recv()
或read()
函數(shù)來接收數(shù)據(jù)。例如,服務(wù)器可以? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 使用socket.recv(buffer_size)
來接收客戶端發(fā)送的數(shù)據(jù),其中buffer_size
表示接收緩沖區(qū)的大小。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 當(dāng)數(shù)據(jù)包到達(dá)接收端時,網(wǎng)絡(luò)協(xié)議棧會根據(jù) TCP 頭部的信息進(jìn)行排序、確認(rèn)等操作,將數(shù)據(jù)組裝成完整的消息并傳遞給應(yīng)用程序。
- 發(fā)送數(shù)據(jù):連接建立后,無論是客戶端還是服務(wù)器都可以通過已經(jīng)建立的 Socket 發(fā)送數(shù)據(jù)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?在編程中,通常使用
關(guān)閉 Socket 連接
-
- 主動關(guān)閉(以客戶端為例):當(dāng)數(shù)據(jù)傳輸完成后,客戶端可以主動關(guān)閉 Socket 連接。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這通過調(diào)用
close()
函數(shù)來實現(xiàn)。在關(guān)閉之前,客戶端會向服務(wù)器發(fā)送一個 FIN(結(jié)束)數(shù)據(jù)包,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?告知服務(wù)器自己不再發(fā)送數(shù)據(jù)了。 - 四次揮手過程(TCP 連接關(guān)閉)
- 第一次揮手:客戶端發(fā)送 FIN 數(shù)據(jù)包,表示自己沒有數(shù)據(jù)要發(fā)送了,請求關(guān)閉連接。
- 第二次揮手:服務(wù)器收到 FIN 數(shù)據(jù)包后,會發(fā)送一個 ACK 數(shù)據(jù)包給客戶端,確認(rèn)收到客戶端的關(guān)閉請求。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 此時,服務(wù)器可能還有數(shù)據(jù)要發(fā)送給客戶端,所以連接還不能完全關(guān)閉。
- 第三次揮手(如果服務(wù)器也沒有數(shù)據(jù)要發(fā)送):當(dāng)服務(wù)器發(fā)送完剩余的數(shù)據(jù)后,它會向客戶端發(fā)送一個? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FIN 數(shù)據(jù)包,表示自己也沒有數(shù)據(jù)要發(fā)送了,請求關(guān)閉連接。
- 第四次揮手:客戶端收到服務(wù)器的 FIN 數(shù)據(jù)包后,會發(fā)送一個 ACK 數(shù)據(jù)包給服務(wù)器,確認(rèn)收到服務(wù)器的? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 關(guān)閉請求。經(jīng)過這四次揮手,TCP 連接才完全關(guān)閉,雙方釋放占用的資源。
- 主動關(guān)閉(以客戶端為例):當(dāng)數(shù)據(jù)傳輸完成后,客戶端可以主動關(guān)閉 Socket 連接。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這通過調(diào)用