在計(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ù)器和瀏覽器:瀏覽器獲取用戶輸入的URL罐孝,向服務(wù)器發(fā)起請(qǐng)求呐馆,服務(wù)器分析接收到的URL,將對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容返回給瀏覽器莲兢,瀏覽器再經(jīng)過(guò)解析和渲染汹来,就將文字、圖片改艇、視頻等元素呈現(xiàn)給用戶收班。學(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è)虛擬的厂榛、邏輯上的概念±霾眩可以將端口理解為一道門(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ì)的影響洒擦。
<b><em>注意:SOCK_DGRAM 沒(méi)有想象中的糟糕,不會(huì)頻繁的丟失數(shù)據(jù)怕膛,數(shù)據(jù)錯(cuò)誤只是小概率事件熟嫩。
有可能多種協(xié)議使用同一種數(shù)據(jù)傳輸方式,所以在 socket 編程中褐捻,需要同時(shí)指明數(shù)據(jù)傳輸方式和協(xié)議掸茅。</em></b>