Socket是什么?
在計(jì)算機(jī)通信領(lǐng)域,socket 被翻譯為“套接字”,它是計(jì)算機(jī)之間進(jìn)行通信的一種約定或一種方式。通過(guò) socket 這種約定,一臺(tái)計(jì)算機(jī)可以接收其他計(jì)算機(jī)的數(shù)據(jù),也可以向其他計(jì)算機(jī)發(fā)送數(shù)據(jù)。
socket 的典型應(yīng)用就是 Web 服務(wù)器和瀏覽器:瀏覽器獲取用戶(hù)輸入的URL,向服務(wù)器發(fā)起請(qǐng)求,服務(wù)器分析接收到的URL,將對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容返回給瀏覽器,瀏覽器再經(jīng)過(guò)解析和渲染,就將文字、圖片、視頻等元素呈現(xiàn)給用戶(hù)。
學(xué)習(xí) socket,也就是學(xué)習(xí)計(jì)算機(jī)之間如何通信,并編寫(xiě)出實(shí)用的程序。
IP地址(IP Address)
計(jì)算機(jī)分布在世界各地,要想和它們通信,必須要知道確切的位置。確定計(jì)算機(jī)位置的方式有多種,IP 地址是最常用的,例如,114.114.114.114 是國(guó)內(nèi)第一個(gè)、全球第三個(gè)開(kāi)放的 DNS 服務(wù)地址,127.0.0.1 是本機(jī)地址。
其實(shí),我們的計(jì)算機(jī)并不知道 IP 地址對(duì)應(yīng)的地理位置,當(dāng)要通信時(shí),只是將 IP 地址封裝到要發(fā)送的數(shù)據(jù)包中,交給路由器去處理。路由器有非常智能和高效的算法,很快就會(huì)找到目標(biāo)計(jì)算機(jī),并將數(shù)據(jù)包傳遞給它,完成一次單向通信。
目前大部分軟件使用 IPv4 地址,但 IPv6 也正在被人們接受,尤其是在教育網(wǎng)中,已經(jīng)大量使用。
端口(Port)
有了 IP 地址,雖然可以找到目標(biāo)計(jì)算機(jī),但仍然不能進(jìn)行通信。一臺(tái)計(jì)算機(jī)可以同時(shí)提供多種網(wǎng)絡(luò)服務(wù),例如Web服務(wù)、FTP服務(wù)(文件傳輸服務(wù))、SMTP服務(wù)(郵箱服務(wù))等,僅有 IP 地址,計(jì)算機(jī)雖然可以正確接收到數(shù)據(jù)包,但是卻不知道要將數(shù)據(jù)包交給哪個(gè)網(wǎng)絡(luò)程序來(lái)處理,所以通信失敗。
為了區(qū)分不同的網(wǎng)絡(luò)程序,計(jì)算機(jī)會(huì)為每個(gè)網(wǎng)絡(luò)程序分配一個(gè)獨(dú)一無(wú)二的端口號(hào)(Port Number),例如,Web服務(wù)的端口號(hào)是 80,F(xiàn)TP 服務(wù)的端口號(hào)是 21,SMTP 服務(wù)的端口號(hào)是 25。
端口(Port)是一個(gè)虛擬的、邏輯上的概念??梢詫⒍丝诶斫鉃橐坏篱T(mén),數(shù)據(jù)通過(guò)這道門(mén)流入流出,每道門(mén)有不同的編號(hào),就是端口號(hào)。如下圖所示:

協(xié)議(Protocol)
- 協(xié)議(Protocol)就是網(wǎng)絡(luò)通信的約定,通信的雙方必須都遵守才能正常收發(fā)數(shù)據(jù)。協(xié)議有很多種,例如 TCP、UDP、IP 等,通信的雙方必須使用同一協(xié)議才能通信。協(xié)議是一種規(guī)范,由計(jì)算機(jī)組織制定,規(guī)定了很多細(xì)節(jié),例如,如何建立連接,如何相互識(shí)別等。
協(xié)議僅僅是一種規(guī)范,必須由計(jì)算機(jī)軟件來(lái)實(shí)現(xiàn)。例如 IP 協(xié)議規(guī)定了如何找到目標(biāo)計(jì)算機(jī),那么各個(gè)開(kāi)發(fā)商在開(kāi)發(fā)自己的軟件時(shí)就必須遵守該協(xié)議,不能另起爐灶。
- 所謂協(xié)議族(Protocol Family),就是一組協(xié)議(多個(gè)協(xié)議)的統(tǒng)稱(chēng)。最常用的是 TCP/IP 協(xié)議族,它包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百個(gè)互為關(guān)聯(lián)的協(xié)議,由于 TCP、IP 是兩種常用的底層協(xié)議,所以把它們統(tǒng)稱(chēng)為 TCP/IP 協(xié)議族。
數(shù)據(jù)傳輸方式
計(jì)算機(jī)之間有很多數(shù)據(jù)傳輸方式,各有優(yōu)缺點(diǎn),常用的有兩種:SOCK_STREAM 和 SOCK_DGRAM。
SOCK_STREAM 表示面向連接的數(shù)據(jù)傳輸方式。數(shù)據(jù)可以準(zhǔn)確無(wú)誤地到達(dá)另一臺(tái)計(jì)算機(jī),如果損壞或丟失,可以重新發(fā)送,但效率相對(duì)較慢。常見(jiàn)的 http 協(xié)議就使用 SOCK_STREAM 傳輸數(shù)據(jù),因?yàn)橐_保數(shù)據(jù)的正確性,否則網(wǎng)頁(yè)不能正常解析。
SOCK_DGRAM 表示無(wú)連接的數(shù)據(jù)傳輸方式。計(jì)算機(jī)只管傳輸數(shù)據(jù),不作數(shù)據(jù)校驗(yàn),如果數(shù)據(jù)在傳輸中損壞,或者沒(méi)有到達(dá)另一臺(tái)計(jì)算機(jī),是沒(méi)有辦法補(bǔ)救的。也就是說(shuō),數(shù)據(jù)錯(cuò)了就錯(cuò)了,無(wú)法重傳。因?yàn)?SOCK_DGRAM 所做的校驗(yàn)工作少,所以效率比 SOCK_STREAM 高。
QQ 視頻聊天和語(yǔ)音聊天就使用 SOCK_DGRAM 傳輸數(shù)據(jù),因?yàn)槭紫纫WC通信的效率,盡量減小延遲,而數(shù)據(jù)的正確性是次要的,即使丟失很小的一部分?jǐn)?shù)據(jù),視頻和音頻也可以正常解析,最多出現(xiàn)噪點(diǎn)或雜音,不會(huì)對(duì)通信質(zhì)量有實(shí)質(zhì)的影響。
注意:SOCK_DGRAM 沒(méi)有想象中的糟糕,不會(huì)頻繁的丟失數(shù)據(jù),數(shù)據(jù)錯(cuò)誤只是小概率事件。
有可能多種協(xié)議使用同一種數(shù)據(jù)傳輸方式,所以在 socket 編程中,需要同時(shí)指明數(shù)據(jù)傳輸方式和協(xié)議。
綜上所述:IP地址和端口能夠在廣袤的互聯(lián)網(wǎng)中定位到要通信的程序,協(xié)議和數(shù)據(jù)傳輸方式規(guī)定了如何傳輸數(shù)據(jù),有了這些,兩臺(tái)計(jì)算機(jī)就可以通信了。