淺談SOCKET

1.什么是socket,socket的作用是什么?

那到底socket是什么?隨便百度一下是這么回答的,

Socket就是套接字??蛻舳伺c服務(wù)器之間通信用的。”,

對(duì)于初學(xué)者來說可能不太懂,那么搜一下什么是套接字,百度是這么回答的,

源IP地址和目的IP地址以及源端口號(hào)和目的端口號(hào)的組合稱為套接字。其用于標(biāo)識(shí)客戶端請(qǐng)求的服務(wù)器和服務(wù)。”,

那么問題又來了,什么是端口號(hào),

TCP/IP協(xié)議中的端口就是邏輯端口,通過不同的邏輯端口來區(qū)分不同的服務(wù)。一個(gè)IP地址的端口通過16bit進(jìn)行編號(hào),最多可以有65536個(gè)端口。端口是通過端口號(hào)來標(biāo)記的,端口號(hào)只有整數(shù),范圍是從0 到65535。”,

問題又來了什么是端口,

我們知道,一臺(tái)擁有IP地址的主機(jī)可以提供許多服務(wù),比如Web服務(wù)、FTP服務(wù)、SMTP服務(wù)等,這些服務(wù)完全可以通過1個(gè)IP地址來實(shí)現(xiàn)。那么,主機(jī)是怎樣區(qū)分不同的網(wǎng)絡(luò)服務(wù)呢?顯然不能只靠IP地址,因?yàn)镮P 地址與網(wǎng)絡(luò)服務(wù)的關(guān)系是一對(duì)多的關(guān)系。實(shí)際上是通過“IP地址+端口號(hào)”來區(qū) 分不同的服務(wù)的。”,

解釋到這里可能會(huì)更有一種云里霧里的感覺了,那就簡(jiǎn)單點(diǎn)吧,只看后面半句,socket就是用來通信的。當(dāng)然,你不希望你只知道一點(diǎn)表面吧,其實(shí)socket只是提供了一些函數(shù),它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。

2.三次握手原理?四次握手是什么鬼?

? ? ? 相信計(jì)算機(jī)專業(yè)的人都會(huì)對(duì)這個(gè)有些了解,面試的時(shí)候也是經(jīng)常會(huì)問到的一個(gè)問題,三次握手直接看圖吧,盜了兩張圖,感興趣的同學(xué)可以對(duì)其中數(shù)字加以理解。

三次握手圖

廢話不多說,

SYN包:連接用的包。

Seq包:可以看出來發(fā)包的順序。第一次隨機(jī)產(chǎn)生客戶端的X位置。第二次產(chǎn)生服務(wù)器端Y的位置。第三次表示我把X+1開始的位置發(fā)過去了。

Ack:應(yīng)答包,意思是我收到了。第一次為0,第二次,意思是服務(wù)器說我下次我可以收X+1的位置的數(shù)據(jù)了。第三次意思是,客戶端說下次我可以收到你Y+1位置開始的數(shù)據(jù)了。

細(xì)細(xì)理解吧。


四次握手

FIN表示斷開連接的包。


? ? ? 當(dāng)然,當(dāng)客戶端和服務(wù)器三次握手后建立長連接的時(shí)候就不需要經(jīng)過三次握手來互相通信了,只需要兩次,客戶端發(fā)給服務(wù)器一個(gè)包,服務(wù)器答復(fù)客戶端一個(gè)包。

3.滑動(dòng)窗口機(jī)制

? ? ? 說到滑動(dòng)窗口,需要理解兩個(gè)概念,一個(gè)是應(yīng)答機(jī)制,一個(gè)是緩沖區(qū),一條數(shù)據(jù)成功發(fā)送的過程是這樣的,A把數(shù)據(jù)放到自己的發(fā)送緩沖區(qū),發(fā)送緩沖區(qū)保留了這條數(shù)據(jù),然后把這條數(shù)據(jù)發(fā)送給B的接受緩沖區(qū),B接受到這條數(shù)據(jù)后回返回給A一個(gè)ACK包,表示B收到了,A再把緩沖區(qū)里面的剛發(fā)送成功的數(shù)據(jù)清空,這就是一條數(shù)據(jù)正常發(fā)送的過程。

? ? ? 注意:當(dāng)B的緩沖區(qū)滿的時(shí)候,A就不能再次發(fā)送數(shù)據(jù)了。當(dāng)由于網(wǎng)絡(luò)等原因B沒有收到A發(fā)的數(shù)據(jù)時(shí),A會(huì)用重發(fā)機(jī)制,把緩存里面的數(shù)據(jù)重新發(fā)送一遍。

4.擁塞控制

? ? ? 有沒有發(fā)現(xiàn)每次用socket的時(shí)候,發(fā)送數(shù)據(jù)的大小會(huì)漸漸變大,這是因?yàn)?a target="_blank" rel="nofollow">TCP的擁塞控制。計(jì)算機(jī)網(wǎng)絡(luò)中的帶寬、交換結(jié)點(diǎn)中的緩存和處理機(jī)等,都是網(wǎng)絡(luò)的資源。在某段時(shí)間,若對(duì)網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡(luò)的性能就會(huì)變壞。這種情況就叫做擁塞。擁塞控制就是防止過多的數(shù)據(jù)注入網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載。擁塞控制是一個(gè)全局性的過程,和流量控制不同,流量控制指點(diǎn)對(duì)點(diǎn)通信量的控制。

? ? ? 發(fā)送方維持一個(gè)叫做擁塞窗口cwnd(congestion window)的狀態(tài)變量。擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動(dòng)態(tài)地在變化。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口,另外考慮到接受方的接收能力,發(fā)送窗口可能小于擁塞窗口。慢開始算法的思路就是,不要一開始就發(fā)送大量的數(shù)據(jù),先探測(cè)一下網(wǎng)絡(luò)的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。

擁塞控制
算法

? ? ? 當(dāng)然收到單個(gè)確認(rèn)但此確認(rèn)多個(gè)數(shù)據(jù)報(bào)的時(shí)候就加相應(yīng)的數(shù)值。所以一次傳輸輪次之后擁塞窗口就加倍。這就是乘法增長,和后面的擁塞避免算法的加法增長比較。

? ? ? 為了防止cwnd增長過大引起網(wǎng)絡(luò)擁塞,還需設(shè)置一個(gè)慢開始門限ssthresh狀態(tài)變量。ssthresh的用法如下:

當(dāng)condo<ssthresh時(shí),使用慢算法。

當(dāng)cwnd>ssthresh時(shí),改用擁塞避免算法。

當(dāng)cwnd=ssthresh時(shí),慢開始與擁塞避免算法任意。

? ? ? 擁塞避免算法讓擁塞窗口緩慢增長,即每經(jīng)過一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口按線性規(guī)律緩慢增長。

? ? ? 無論是在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有收到確認(rèn),雖然沒有收到確認(rèn)可能是其他原因的分組丟失,但是因?yàn)闊o法判定,所以都當(dāng)做擁塞來處理),就把慢開始門限設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送窗口大小的一半。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開始算法。


? ? ? socket還有半開半關(guān)閉狀態(tài)等等,感興趣的可以自己研究一下,以上有問題的地方歡迎指出。

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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