<6>web服務(wù)的數(shù)據(jù)收發(fā)操作
服務(wù)器程序的結(jié)構(gòu)
- 連接模塊
- 負(fù)責(zé)與客戶端通信的模塊
服務(wù)端的嵌套字和端口號(hào)
客戶端調(diào)用Socket庫(kù)階段
- 創(chuàng)建嵌套字
- 用管道連接服務(wù)器端的嵌套字
- 收發(fā)階段
- 斷開(kāi)管道并刪除嵌套字
服務(wù)端調(diào)用Socket庫(kù)階段
- 創(chuàng)建嵌套字
- 將嵌套字設(shè)置為等待連接狀態(tài)
- 接受連接
- 收發(fā)階段
- 斷開(kāi)管道并刪除嵌套字
應(yīng)用程序和協(xié)議棧之間是使用描述符來(lái)代替嵌套字
- 等待連接的嵌套字中沒(méi)有客戶端IP地址和端口號(hào)
- 使用描述符這種信息比較簡(jiǎn)單
6.2服務(wù)器的收發(fā)操作
2020年5月5日
21:00
網(wǎng)卡將接收到的信號(hào)轉(zhuǎn)換成數(shù)字信息
- 網(wǎng)卡的MAC模塊將網(wǎng)絡(luò)包從信號(hào)還原成數(shù)字信息,校驗(yàn)FCS并存入緩沖區(qū)
- 網(wǎng)卡驅(qū)動(dòng)會(huì)根據(jù)MAC頭部判斷協(xié)議類型,并將包交給相應(yīng)的協(xié)議棧
IP模塊的接收操作
協(xié)議棧的IP模塊會(huì)檢查IP頭部
- 判斷是不是發(fā)給自己的
- 判斷網(wǎng)絡(luò)包是否經(jīng)過(guò)分片
- 將包轉(zhuǎn)交給TCP模塊或者UDP模塊
TCP模塊如何處理連接包
如果收到的是發(fā)起連接的包,TCP模塊
- 確認(rèn)TCP頭部的控制位SYN
- 檢查接收方端口號(hào)
- 為相應(yīng)的等待連接嵌套字復(fù)制一個(gè)新的副本
- 記錄發(fā)送方的IP地址和端口號(hào)等信息
TCP模塊如何處理數(shù)據(jù)包
收到數(shù)據(jù)之后,TCP模塊
- 根據(jù)收到的包的發(fā)送方IP地址、發(fā)送方的端口號(hào)、接收方的IP地址和接收方的端口號(hào)找到對(duì)應(yīng)的嵌套字
- 將數(shù)據(jù)塊拼合并保存在接受緩沖區(qū)中
- 向客戶端返回ACK
TCP模塊的斷開(kāi)操作
- 服務(wù)器調(diào)用Socket庫(kù)的close,生成一個(gè)控制位FIN為1 的TCP頭部
6.3web服務(wù)器程序解析請(qǐng)求消息并作出響應(yīng)
2020年5月5日
21:30
將請(qǐng)求的URI轉(zhuǎn)化為實(shí)際的文件名
- web服務(wù)器公開(kāi)的目錄其實(shí)并不是磁盤上的實(shí)際目錄,而是虛擬目錄
- URI中寫的就是虛擬目錄的路徑名
運(yùn)行CGI程序
訪問(wèn)的文件為程序文件,Web服務(wù)器會(huì)委托給操作系統(tǒng)運(yùn)行這個(gè)程序
- GET:將URI后面的參數(shù)傳遞給程序
- POST:將消息中的數(shù)據(jù)傳遞給程序
web服務(wù)器的控制訪問(wèn)
web服務(wù)器的控制訪問(wèn)規(guī)則
- 客戶端的IP地址
- 客戶端域名
- 用戶名和密碼
返回響應(yīng)消息
- web服務(wù)器調(diào)用Socket庫(kù)中write,將響應(yīng)消息交給協(xié)議棧
6.4瀏覽器接受響應(yīng)消息并顯示內(nèi)容
2020年5月5日
21:46
通過(guò)響應(yīng)數(shù)據(jù)類型并判斷其中的內(nèi)容
- 根據(jù)響應(yīng)消息開(kāi)頭的Content-Type頭部的值進(jìn)行判斷數(shù)據(jù)類型
- 消息的Content-Type定義數(shù)據(jù)類型
[圖片上傳失敗...(image-fb553c-1588686707760)]