溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Web服務(wù)基礎(chǔ)

發(fā)布時(shí)間:2020-06-25 17:42:20 來源:網(wǎng)絡(luò) 閱讀:1505 作者:iTab 欄目:建站服務(wù)器

一、HTTP概述


HTTP是HyperText Transfer Protocol的縮寫,即超文本傳輸協(xié)議。HTTP是應(yīng)用層協(xié)議,同其他應(yīng)用層協(xié)議一樣,是為了實(shí)現(xiàn)某一類具體應(yīng)用的協(xié)議,并由某一運(yùn)行在用戶空間的應(yīng)用程序來實(shí)現(xiàn)其功能。HTTP是一種協(xié)議規(guī)范,這種規(guī)范是記錄在文檔上的,為真正通過HTTP協(xié)議進(jìn)行通信的HTTP的實(shí)現(xiàn)程序。我們知道,HTTP協(xié)議是基于C/S架構(gòu)的進(jìn)行通信的,而HTTP協(xié)議的服務(wù)器端實(shí)現(xiàn)程序有httpd、nginx等,其客戶端的實(shí)現(xiàn)程序主要是Web瀏覽器,例如Firefox、Internet Explorer、Google chrome、Safari、Opera等,此外,客戶端的命令行工具還有elink、crul等。Web服務(wù)是基于TCP的,因此為了能夠隨時(shí)響應(yīng)客戶端的請(qǐng)求,Web服務(wù)器需要監(jiān)聽在80/TCP端口。這客戶端瀏覽器和Web服務(wù)器之間就可以通過HTTP協(xié)議進(jìn)行通信了。



二、IANA定義的端口


我們知道,Web服務(wù)器為了讓所有客戶瀏覽器程序能夠與之通信,通常都需要監(jiān)聽在80端口。用戶在瀏覽器上鍵入U(xiǎn)RL時(shí),例如:www.baidu.com,默認(rèn)端口就是80。這一端口是由IANA(Internet Assigned Numbers Authority )分配指定的。另外,IANA是由ICANN管理的,其定義的端口如下:

0-1023:眾所周知的端口,永久地分配給固定的應(yīng)用使用,這些端口的使用需要特定的應(yīng)用去注冊(cè),屬于特權(quán)端口,例如Web服務(wù)的80/tcp,F(xiàn)TP的21/tcp等。該類端口只有系統(tǒng)管理員才有權(quán)限啟用,并讓進(jìn)程監(jiān)聽,而普通用戶則沒有權(quán)限。

1024-41951:亦為注冊(cè)端口,但要求不是特別嚴(yán)格,這些端口分配給程序,并注冊(cè)為某個(gè)應(yīng)用使用,但這些應(yīng)用并不是很常見,例如mysql服務(wù)的3306/tcp,memcache的11211/tcp等。

41952+:客戶端程序隨機(jī)使用的端口,為動(dòng)態(tài)端口,或私有端口。在Linux上該類端口范圍定義在/proc/sys/net/ipv4/ip_local_port_range中。



三、BSD Socket


BSD Socket最早是BSD Unix系統(tǒng)的進(jìn)程通信機(jī)制。Socket即為套接字,作為IPC(Inter-Process Communication,進(jìn)程間通信)的一種實(shí)現(xiàn),允許位于不同主機(jī)上(也可以是同一主機(jī)上)的進(jìn)程間通信機(jī)制。Socket可理解為“插座”,只要電線插上了這個(gè)“插座”,就可以進(jìn)行通信了。Socket本質(zhì)上應(yīng)該是Socket API,它封裝了內(nèi)核中socket通信相關(guān)的通信細(xì)節(jié),也就是封裝了通信子網(wǎng)(傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層)要實(shí)現(xiàn)的具體的通信細(xì)節(jié),而程序員通過調(diào)用Socket API就可以編寫能夠?qū)崿F(xiàn)網(wǎng)絡(luò)通信的程序了。


Socket描述的是IP地址和端口。不同的服務(wù)所對(duì)應(yīng)的端口號(hào)不同,每種服務(wù)需要綁定并監(jiān)聽在一個(gè)端口上,打開一個(gè)Socket,而客戶端可以通過一個(gè)Socket跟服務(wù)器上的Socket建立連接,這樣二者就能實(shí)現(xiàn)通信了,我們把正處于通信狀態(tài)的一對(duì)套接字稱為已連接套接字。總的來說,Socket是應(yīng)用層與傳輸層之間的橋梁,如圖。


Web服務(wù)基礎(chǔ)

前面提到,Socket是對(duì)IP地址和端口號(hào)的描述,一個(gè)IP地址+一個(gè)端口就是一個(gè)套接字(socket)。根據(jù)Socket在傳輸層使用的協(xié)議可分為以下三類:

(1)SOCK_STREAM:tcp套接字

(2)SOCK_DGRAM:udp套接字

(3)SOCK_RAW:raw套接字


這里的raw套接字指的是在不使用任何傳輸層協(xié)議(例如tcp, udp等)的情況下直接通過發(fā)送或接收IP數(shù)據(jù)包實(shí)現(xiàn)通信的一種方式,也就是應(yīng)用層直接繞過像tcp/udp這樣的協(xié)議直接基于IP數(shù)據(jù)包通信。


根據(jù)Socket監(jiān)聽的地址格式,Socket Domain可分為:

(1)AF_INET:Address Family,IPv4地址格式

(2)AF_INET6:Address Family,IPv6地址格式

(3)AF_UNIX:Address Family,同一主機(jī)上不同進(jìn)程間基于Socket套接字通信所使用的一種地址格式,這種地址的表現(xiàn)形式就是一個(gè)套接字文件(Linux一切皆文件);這種地址又稱為Unix_SOCK.


接下來介紹TCP客戶端和服務(wù)器是如何通過TCP套接字接口進(jìn)行通信的。如圖。

Web服務(wù)基礎(chǔ)

對(duì)于TCP服務(wù)器端來說,首先需要調(diào)用socket()函數(shù),向內(nèi)核注冊(cè)申請(qǐng)創(chuàng)建TCP套接字(IP地址+端口);一旦申請(qǐng)成功了,就要通過bind()函數(shù)綁定程序到這個(gè)套接字上;綁定之后,需要調(diào)用listen()函數(shù),使服務(wù)器進(jìn)程監(jiān)聽在這個(gè)套接字上,允許套接字進(jìn)行連接,但此時(shí)還不能接收用戶請(qǐng)求;只有再調(diào)用accept()函數(shù)之后才開始負(fù)責(zé)接收客戶端請(qǐng)求,并在客戶端請(qǐng)求到達(dá)之前一直處于阻塞狀態(tài),此時(shí)TCP服務(wù)器進(jìn)程的狀態(tài)為LISTEN。


對(duì)于TCP客戶端來說,同樣需要調(diào)用socket()函數(shù)創(chuàng)建套接字,但不需要監(jiān)聽;當(dāng)客戶端向服務(wù)器發(fā)起連接請(qǐng)求時(shí),即調(diào)用connect()函數(shù),其中在括號(hào)中的參數(shù)包括對(duì)方服務(wù)器的IP地址和端口;如果服務(wù)器接收連接請(qǐng)求,則雙方進(jìn)行了tcp三次握手,建立雙向的虛鏈路,此時(shí)客戶端和服務(wù)器之間的套接字處于已連接狀態(tài)(ESTABLISHED),之后的http請(qǐng)求/響應(yīng)報(bào)文都是基于此前建立的虛鏈路進(jìn)行發(fā)送。


在Linux上,當(dāng)連接建立之后,客戶端就可以在與服務(wù)器建立連接的socket文件上填寫需要請(qǐng)求的數(shù)據(jù),寫入數(shù)據(jù)就相當(dāng)于向服務(wù)器發(fā)送數(shù)據(jù)了,此過程通過調(diào)用write()函數(shù)完成;而服務(wù)器端則可以在與客戶端建立連接的socket文件上讀取數(shù)據(jù),即調(diào)用read()函數(shù),這一過程相當(dāng)于接收客戶端請(qǐng)求的數(shù)據(jù),二者之間具體的通信細(xì)節(jié)由底層的通信子網(wǎng)完成。服務(wù)器讀取到客戶端發(fā)送過來的請(qǐng)求報(bào)文后,接著進(jìn)行解析請(qǐng)求、處理請(qǐng)求并構(gòu)建響應(yīng)報(bào)文,再通過調(diào)用write()函數(shù)把響應(yīng)報(bào)文寫入socket文件,通過通信子網(wǎng)傳送到客戶端的socket文件上,客戶端就可以通過這個(gè)socket文件得到服務(wù)器的響應(yīng)報(bào)文了。如此往復(fù)循環(huán)多次,直到客戶端請(qǐng)求斷開連接(一般是由客戶端主動(dòng)請(qǐng)求斷開連接,在使用keep-alive連接方式時(shí)則有可能是服務(wù)器主動(dòng)請(qǐng)求斷開連接)。


一旦客戶端請(qǐng)求斷開連接,TCP服務(wù)器通過調(diào)用read()函數(shù)讀取socket文件內(nèi)的斷開請(qǐng)求數(shù)據(jù),同意斷開連接。




向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI