溫故而知新--Soket(自用)

自己整理,方便平時(shí)常看。不喜勿噴

TCP/IP

從字面意思來(lái)看TCP/IPTCPIP協(xié)議的合稱,但實(shí)際上TCP/IP協(xié)議是指因特網(wǎng)整個(gè)TCP/IP協(xié)議族。不同于ISO模型的七個(gè)分層,TCP/IP協(xié)議參考模型把所有的TCP/IP系列協(xié)議歸類到四個(gè)抽象層中.

應(yīng)用層:TFTP,HTTP,SNMP,F(xiàn)TP,SMTP,DNS,Telnet 等等

傳輸層:TCP,UDP

網(wǎng)絡(luò)層:IP,ICMP,OSPF,EIGRP,IGMP

數(shù)據(jù)鏈路層:SLIP,CSLIP,PPP,MTU

Socket概念

socket(套接字)通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:

  • 連接使用的協(xié)議
  • 本地主機(jī)的IP地址
  • 本地進(jìn)程的協(xié)議端口,
  • 遠(yuǎn)地主機(jī)的IP地址,
  • 遠(yuǎn)地進(jìn)程的協(xié)議端口。

總的來(lái)說(shuō)就是通信協(xié)議,協(xié)議端口,IP地址三個(gè)大的部分。

建立Socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket。套接字之間的連接過(guò)程分為三個(gè)步驟:

  • 1.服務(wù)器監(jiān)聽(tīng)
  • 2.客戶端請(qǐng)求
  • 3.連接確認(rèn)。

Socket可以支持不同的傳輸層協(xié)議(TCPUDP),當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí),該Socket連接就是一個(gè)TCP連接,UDP連接同理。

在本地進(jìn)程通訊中我們可以使用PID來(lái)唯一標(biāo)示一個(gè)進(jìn)程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大,這時(shí)候我們需要另辟它徑了,我們知道IP層的ip地址可以唯一標(biāo)示主機(jī),而`TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程,這樣我們可以利用ip地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程。

socket是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。

socket起源于UNIX,在Unix一切皆文件哲學(xué)的思想下,socket是一種"打開(kāi)—讀/寫(xiě)—關(guān)閉"模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)"文件",在建立連接打開(kāi)后,可以向自己文件寫(xiě)入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。

通信流程

socket是"打開(kāi)—讀/寫(xiě)—關(guān)閉"模式的實(shí)現(xiàn),以使用TCP協(xié)議通訊的socket為例,其交互流程大概是這樣子的:

1、服務(wù)端

  • 1.服務(wù)器根據(jù)地址類型(ipv4,ipv6)、socket類型、協(xié)議創(chuàng)建socket
  • 2.服務(wù)器為socket綁定ip地址和端口號(hào)
  • 3.服務(wù)器socket監(jiān)聽(tīng)端口號(hào)請(qǐng)求,隨時(shí)準(zhǔn)備接收客戶端發(fā)來(lái)的連接,這時(shí)候服務(wù)器的socket并沒(méi)有被打開(kāi).

2、客戶端(開(kāi)始三次握手)

  • 1、客戶端創(chuàng)建socket
  • 2、客戶端打開(kāi)socket,根據(jù)服務(wù)器ip地址和端口號(hào)試圖連接服務(wù)器socket。

3、服務(wù)端

  • 1、服務(wù)器socket接收到客戶端socket請(qǐng)求,被動(dòng)打開(kāi),開(kāi)始接收客戶端請(qǐng)求,直到客戶端返回連接信息。這時(shí)候socket進(jìn)入阻塞狀態(tài),所謂阻塞即accept()方法一直到客戶端返回連接信息后才返回,開(kāi)始接收下一個(gè)客戶端諒解請(qǐng)求

4、客戶端

  • 1、客戶端連接成功,向服務(wù)器發(fā)送連接狀態(tài)信息

5、服務(wù)器(三次握手完成)

  • 1、服務(wù)器accept方法返回,連接成功

6、客戶端

  • 1、客戶端向socket寫(xiě)入信息

7、服務(wù)器

  • 1、服務(wù)器讀取信息

8、客戶端

  • 1、客戶端關(guān)閉

9、服務(wù)器端

  • 1、服務(wù)器端關(guān)閉

三次握手

三次握手是為了確認(rèn)客戶端跟服務(wù)器都能接受到對(duì)方的信息。

  • 第一次握手:客戶端給服務(wù)器發(fā)包。此時(shí)服務(wù)器確認(rèn)自己可以接收客戶端的包, 客戶端不確認(rèn)服務(wù)器是否接收到了自己發(fā)的包。客戶端不知道

  • 第二次握手,服務(wù)器端回復(fù)客戶端。 此時(shí)客戶端確認(rèn)自己發(fā)的包被服務(wù)器收到,也確認(rèn)自己可以正常接收服務(wù)器包,客戶端對(duì)此次通信沒(méi)有疑問(wèn)了。服務(wù)器可以確認(rèn)自己能接收到客戶端的包,但不能確認(rèn)客戶端能否接收自己發(fā)的包。服務(wù)端不知道

  • 第三次握手,客戶端回復(fù)服務(wù)器。 客戶端已經(jīng)沒(méi)有疑問(wèn)了,服務(wù)器也確認(rèn)剛剛客戶端收到了自己的包。兩邊都沒(méi)有問(wèn)題,開(kāi)始通信。兩邊都知道。

形象比喻:

三次握手:
“喂,你聽(tīng)得到嗎?”
“我聽(tīng)得到呀,你聽(tīng)得到我嗎?”
“我能聽(tīng)到你,今天balabala……”

兩次握手:
“喂,你聽(tīng)得到嗎?”
“我聽(tīng)得到呀”

“喂喂,你聽(tīng)得到嗎?”
“草,我聽(tīng)得到呀!?。?!”
“你TM能不能聽(tīng)到我講話啊??!喂!”
“……”


四次握手:
“喂,你聽(tīng)得到嗎?”
“我聽(tīng)得到呀,你聽(tīng)得到我嗎?”
“我能聽(tīng)到你,你能聽(tīng)到我嗎?”
“……不想跟傻逼說(shuō)話”

再看一個(gè)解釋:

因?yàn)楸WC“ A說(shuō)話B聽(tīng)得到, B說(shuō)話A也聽(tīng)得到”這件事 并讓雙方都知道,剛好至少需要三次shake hands.
如果只讓一方確定這件事就夠了,那兩次握手足矣。

比如A發(fā)送"你聽(tīng)得到我嗎";
B收到并回復(fù)"我聽(tīng)得到,你聽(tīng)得到我嗎?";
A收到這句話;(此時(shí)A已經(jīng)能確定他們兩個(gè)說(shuō)話對(duì)方都聽(tīng)得到,但是B并不知道。)
所以A需要再回復(fù)一次:"我也聽(tīng)得到"。
B收到后,此時(shí)A,B都確定了『我說(shuō)話你聽(tīng)得到,你說(shuō)話我也聽(tīng)得到』這件事。
...

正式解釋

第一次握手:客戶端嘗試連接服務(wù)器,向服務(wù)器發(fā)送syn包(同步序列編號(hào)Synchronize Sequence Numbers),syn=j,客戶端進(jìn)入SYN_SEND狀態(tài)等待服務(wù)器確認(rèn)

第二次握手:服務(wù)器接收客戶端syn包并確認(rèn)(ack=j+1),同時(shí)向客戶端發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)

第三次握手:第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手

定睛一看,服務(wù)器socket與客戶端socket建立連接的部分其實(shí)就是大名鼎鼎的三次握手

四次和三次

握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP連接都將被一直保持下去。斷開(kāi)連接時(shí)服務(wù)器和客戶端均可以主動(dòng)發(fā)起斷開(kāi)TCP連接的請(qǐng)求,斷開(kāi)過(guò)程需要經(jīng)過(guò)“四次握手”。

TCP連接的拆除

TCP連接的拆除需要發(fā)送四個(gè)包,因此稱為四次握手(four-way handshake)。在socket編程中,任何一方執(zhí)行close()操作即可產(chǎn)生握手(有地方稱為“揮手”)操作。

之所以有“三次握手”和“四次握手”的區(qū)別,是因?yàn)檫B接時(shí)當(dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后,可以直接發(fā)送SYN+ACK報(bào)文。其中ACK報(bào)文是用來(lái)應(yīng)答的,SYN報(bào)文是用來(lái)同步的。

但是關(guān)閉連接時(shí),當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉SOCKET,所以只能先回復(fù)一個(gè)ACK報(bào)文,告訴Client端,”你發(fā)的FIN報(bào)文我收到了”。只有等到我Server端所有的報(bào)文都發(fā)送完了,我才能發(fā)送FIN報(bào)文,因此不能一起發(fā)送。故需要四步握手。

Http

HTTP協(xié)議即超文本傳送協(xié)議(HypertextTransfer Protocol ),是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。

HTTP連接最顯著的特點(diǎn)是客戶端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng),在請(qǐng)求結(jié)束后,會(huì)主動(dòng)釋放連接。從建立連接到關(guān)閉連接的過(guò)程稱為“一次連接”。因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態(tài),需要不斷地向服務(wù)器發(fā)起連接請(qǐng)求。若服務(wù)器長(zhǎng)時(shí)間無(wú)法收到客戶端的請(qǐng)求,則認(rèn)為客戶端“下線”,若客戶端長(zhǎng)時(shí)間無(wú)法收到服務(wù)器的回復(fù),則認(rèn)為網(wǎng)絡(luò)已經(jīng)斷開(kāi)。

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,是HTTP的安全版。 在HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。 HTTPS存在不同于HTTP的默認(rèn)端口及一個(gè)加密/身份驗(yàn)證層(在HTTP與TCP之間)。HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息,因此HTTP協(xié)議不適合傳輸一些敏感信息。

https協(xié)議需要到ca申請(qǐng)證書(shū);http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議;http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443;http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的,HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議。

Socket連接與HTTP連接的不同

通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開(kāi)始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開(kāi)。但在實(shí)際應(yīng)用中,客戶端到服務(wù)器之間的通信防火墻默認(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ù)。

之間的區(qū)別

  • HTTP協(xié)議:簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,對(duì)應(yīng)于應(yīng)用層 ,HTTP協(xié)議是基于TCP連接的
  • TCP協(xié)議: 對(duì)應(yīng)于傳輸層
  • IP協(xié)議: 對(duì)應(yīng)于網(wǎng)絡(luò)層

TCP/IP是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。

  • Socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API),通過(guò)Socket,我們才能使用TCP/IP協(xié)議。
  • Http連接:http連接就是所謂的短連接,即客戶端向服務(wù)器端發(fā)送一次請(qǐng)求,服務(wù)器端響應(yīng)后連接即會(huì)斷掉。
  • Socket連接:socket連接就是所謂的長(zhǎng)連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會(huì)主動(dòng)斷掉;但是由于各種環(huán)境因素可能會(huì)是連接斷開(kāi),比如說(shuō):服務(wù)器端或客戶端主機(jī)down了,網(wǎng)絡(luò)故障,或者兩者之間長(zhǎng)時(shí)間沒(méi)有數(shù)據(jù)傳輸,網(wǎng)絡(luò)防火墻可能會(huì)斷開(kāi)該連接以釋放網(wǎng)絡(luò)資源。所以當(dāng)一個(gè)socket連接中沒(méi)有數(shù)據(jù)的傳輸,那么為了維持連接需要發(fā)送心跳消息~~具體心跳消息格式是開(kāi)發(fā)者自己定義的。

參考

簡(jiǎn)單理解Socket

關(guān)于iOS socket都在這里了

Socket與http的長(zhǎng)連接和短連接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容