套接字socket的作用
以計(jì)算機(jī)為例,套接字socket的作用是支持TCP/IP的網(wǎng)絡(luò)通信的基本操作單元,可以看做是不同主機(jī)之間的進(jìn)程進(jìn)行雙向通信的端點(diǎn),簡(jiǎn)單的說(shuō)就是通信的兩方的一種約定 , 用套接字中的相關(guān)函數(shù)來(lái)完成通信過(guò)程 。
TCP用主機(jī)的IP地址加上主機(jī)上的端口號(hào)作為TCP連接的端點(diǎn),這種端點(diǎn)就叫做套接字(socket)或插口 。套接字用(IP地址:端口號(hào))表示 。它是網(wǎng)絡(luò)通信過(guò)程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必需的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口 。流式套接字用于提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù) 。該服務(wù)將保證數(shù)據(jù)能夠?qū)崿F(xiàn)無(wú)差錯(cuò)、無(wú)重復(fù)發(fā)送,并按順序接收 。流式套接字之所以能夠?qū)崿F(xiàn)可靠的數(shù)據(jù)服務(wù) , 原因在于其使用了傳輸控制協(xié)議,即TCP(TheTransmissionControlProtocol)協(xié)議 。
什么是套接字?其作用是什么?套接字(socket)是用于網(wǎng)絡(luò)通信的基本操作單元 。簡(jiǎn)單的說(shuō)就是通信的兩方的一種約定 , 用套接字中的相關(guān)函數(shù)來(lái)完成通信過(guò)程 。
套接字可以根據(jù)通信性質(zhì)分類,主要分
流式套接字(SOCK_STREAM),
數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)以及原始套接字(SOCK_RAW).
數(shù)據(jù)報(bào)套接字提供了一種不可靠的、非連接的數(shù)據(jù)包通信方式 。所以
數(shù)據(jù)報(bào)套接字使用UDP協(xié)議,當(dāng)然,winsock
2版本還支持其他協(xié)議 。
允許應(yīng)用程序創(chuàng)建網(wǎng)絡(luò)套接字套接字是一套用C語(yǔ)言寫成的應(yīng)用程序開(kāi)發(fā)庫(kù) , 它首先是一個(gè)庫(kù) 。主要作用就是實(shí)現(xiàn)進(jìn)程間通信和網(wǎng)絡(luò)編程,因此在網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)中被廣泛使用 。
套接字(socket)是一個(gè)抽象層,應(yīng)用程序可以通過(guò)它發(fā)送或接收數(shù)據(jù) , 可對(duì)其進(jìn)行像對(duì)文件一樣的打開(kāi)、讀寫和關(guān)閉等操作 。套接字允許應(yīng)用程序與網(wǎng)絡(luò)中的其他應(yīng)用程序進(jìn)行通信 。網(wǎng)絡(luò)套接字是IP地址與端口的組合 。
在Python中可以基于套接字來(lái)使用傳輸層提供的傳輸服務(wù),并以此進(jìn)行開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用 。實(shí)際開(kāi)發(fā)中使用的套接字可以分為三類:流套接字(TCP套接字)、數(shù)據(jù)報(bào)套接字和原始套接字 。
Socket詳解1、 Socket(套接字)概念
網(wǎng)絡(luò)上兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一段稱為一個(gè) socket ,socket是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元 。它是網(wǎng)絡(luò)通信過(guò)程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址 , 本地進(jìn)程的協(xié)議端口 , 遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口 。
Socket是對(duì)TCP/IP協(xié)議的封裝,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面 , 提供一個(gè)易用的接口,所以Socket本身并不是協(xié)議 , 而是一個(gè)調(diào)用接口(API) 。
在一定程度可以認(rèn)為Socket位于應(yīng)用層和傳輸層之間 。創(chuàng)建Socket連接時(shí),可以指定使用的傳輸層協(xié)議 , Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí),該Socket連接就是一個(gè)TCP連接 。
2、 建立Socket連接
建立Socket連接至少需要一對(duì)套接字 , 其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket , 另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket 。
套接字之間的連接過(guò)程分為 三個(gè)步驟 :
(1)服務(wù)器監(jiān)聽(tīng):服務(wù)器端套接字并不定位具體的客戶端套接字 , 而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài) , 等待客戶端的連接請(qǐng)求 。
(2)客戶端請(qǐng)求:指客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字 。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求 。
(3)連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶端套接字的連接請(qǐng)求時(shí) , 就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶 端 , 一旦客戶端確認(rèn)了此描述,雙方就正式建立連接 。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求 。
3、 Socket連接與HTTP連接
由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開(kāi)始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開(kāi) 。但在實(shí)際網(wǎng)絡(luò)應(yīng)用 中 , 客戶端到服務(wù)器之間的通信往往需要穿越多個(gè)中間節(jié)點(diǎn),例如路由器、網(wǎng)關(guān)、防火墻等 , 大部分防火墻默認(rèn)會(huì)關(guān)閉長(zhǎng)時(shí)間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連,因此需要通過(guò)輪詢告訴網(wǎng)絡(luò) , 該連接處于活躍狀態(tài) 。
而HTTP連接使用的是“請(qǐng)求—響應(yīng)”的方式,不僅在請(qǐng)求時(shí)需要先建立連接,而且需要客戶端向服務(wù)器發(fā)出請(qǐng)求后,服務(wù)器端才能回復(fù)數(shù)據(jù) 。
4、 關(guān)于Socket長(zhǎng)連接的心跳包
心跳包就是為了避免一個(gè)連接長(zhǎng)時(shí)間不活躍被關(guān)閉而定時(shí)發(fā)送的一個(gè)”騷擾”數(shù)據(jù)包 。
Socket本身就是長(zhǎng)連接的,那么為什么還要心跳包呢?
理論上說(shuō) , 這個(gè)連接是一直保持連接的,但是實(shí)際情況中 , 如果中間節(jié)點(diǎn)出現(xiàn)什么故障是難以知道的 。更要命的是,有的節(jié)點(diǎn)(防火墻)會(huì)自動(dòng)把一定時(shí)間之內(nèi)沒(méi)有數(shù)據(jù)交互的連接給斷掉 。在這個(gè)時(shí)候,就需要我們的心跳包了 , 用于維持長(zhǎng)連接,保活 。在獲知了斷線之后 , 服務(wù)器邏輯可能需要做一些事情,比如斷線后的數(shù)據(jù)清理 , 重新連接……當(dāng)然,這個(gè)自然是要由邏輯層根據(jù)需求去做了 。總的來(lái)說(shuō) , 心跳包主要也就是用于長(zhǎng)連接的保活和斷線處理 。一般的應(yīng)用下,判定時(shí)間在30-40秒比較不錯(cuò) 。如果實(shí)在要求高 , 那就在6-9秒 。
如果不主動(dòng)關(guān)閉socket的話,系統(tǒng)不會(huì)自動(dòng)關(guān)閉的,除非當(dāng)前進(jìn)程掛掉了,操作系統(tǒng)把占用的socket回收了才會(huì)關(guān)閉 。為什么需要心跳連接?主要是為了判斷當(dāng)前連接是否是有效的、可被使用的 。在實(shí)際應(yīng)用中假設(shè)一段時(shí)間沒(méi)有數(shù)據(jù)傳輸時(shí)候理論上說(shuō)應(yīng)該連接是沒(méi)有問(wèn)題的,但是網(wǎng)絡(luò)復(fù)雜,中途出現(xiàn)問(wèn)題也是常見(jiàn)的,網(wǎng)線被掐斷了、對(duì)方進(jìn)程掛掉了、頻繁丟包等 , 這時(shí)候TCP連接是不可使用的,但是對(duì)于應(yīng)用層并不知道,如果需知道網(wǎng)絡(luò)情況則要很復(fù)雜的超時(shí)進(jìn)行了解 , TCP從底層就實(shí)現(xiàn)了這樣的功能 。心跳機(jī)制是TCP在一段時(shí)間間隔后發(fā)送確認(rèn)連接端是否還存在,如果存在的話就會(huì)回傳一個(gè)包確定網(wǎng)絡(luò)有效 , 如果心跳包有問(wèn)題,則通知上層應(yīng)用當(dāng)前網(wǎng)絡(luò)有問(wèn)題了 。
這取決于你的server端的超時(shí)配置 , 每個(gè)socket連接都是長(zhǎng)連接,它是一個(gè)相當(dāng)占用系統(tǒng)資源的通信管道,如果這個(gè)長(zhǎng)連接什么事也沒(méi)干硬是要占著資源,則server端可以選擇關(guān)閉這個(gè)連接 , 以省下資源讓更多的用戶連接進(jìn)來(lái) 。
所以,即便客戶端的是采用死循環(huán)while(true)方式連到服務(wù)端,對(duì)于特定的客戶端和服務(wù)端類型來(lái)說(shuō)也需要一定時(shí)間間隔的心跳(告訴服務(wù)端,我還活著 , 雖然我沒(méi)干活也沒(méi)說(shuō)話,但別把我關(guān)了)

文章插圖
【套接字socket的作用,什么是套接字?其作用是什么?】以上就是關(guān)于套接字socket的作用,什么是套接字?其作用是什么?的全部?jī)?nèi)容,以及套接字socket的作用的相關(guān)內(nèi)容,希望能夠幫到您 。
- 沒(méi)簽租房合同的押金能退
- 一個(gè)人撐得很累的說(shuō)說(shuō),形容一個(gè)人惰性的句子
- 合浦縣美食,合浦最出名特產(chǎn)的是什么
- 駕駛證長(zhǎng)期是不是就是終身的
- 橡皮的組成材料是什么,橡皮擦能擦掉鉛筆字的原理它的成分是什么
- 法治思維的基本內(nèi)容是什么
- 發(fā)奮識(shí)遍天下字的下一句是什么,發(fā)奮識(shí)遍天下字下面一句是什么
- 西瓜汁的做法
- 夢(mèng)是怎么形成的 夢(mèng)是如何形成的
- 漢壽縣美食,常德哪里的美食最多
