即時通信(I)

網絡通信三要素:

 

網絡七層協議劃分:

 

網絡五層協議的劃分:

 

 要記網絡層的5層協議,能夠把它想像爲一枚洋蔥。學過計算機網絡的,看到這個網絡協議的套接字,大概就會明白了!它是一層一層的進行包裹的,而後交由物理層進行發送的。在網絡七層的基礎上,將應用層、表達層、會話層合併爲應用層了。面試

 

TCP的三次握手:

 簡潔版:服務器

三個步驟的解釋:

第一次:客戶端向服務器端發送請求網絡

SYN = 1 (SYN 是一個同步序列號)spa

ACK = 0 (TCP協議規定的一個標識,還沒鏈接爲0,報文鏈接之後 ACK = 1)計算機網絡

seq = x (客戶端和服務器端身份的驗證是經過序列號是別的,也就是seq)線程

 

第二次:服務端響應客戶端3d

ack = x+1   (回覆報文確認的序列號)
seq = y    (服務器端會把這個序列號帶給客戶端)視頻

SYN = 1blog

ACK = 1    (f)進程

 

第三次:客戶端響應服務器端

ACK = 1

seq = x+1  (用ack做爲下一次同步的鏈接,這是客戶端的作法)

ack = y+1    (客戶端對服務器端身份的確認,這樣就創建了鏈接)

 

 

面試題:爲何要創建3次鏈接?

假設是2次;

  假如在第1次客戶端向服務器端發送請求由於阻塞,客戶端會再次給服務器端發送請求,此次服務器端和客戶端創建了鏈接。這樣雙方就能夠發送數據了,發送完之後就能夠斷開鏈接了。可是這是阻塞的請求到了服務器端,這時會創建第二次鏈接。可是客戶端的數據發送完了,形成了資源的浪費。

  因此第三次是爲了再次確認,避免資源的浪費。

 

網上視頻聊天SDK:

網易,騰訊,青牛的比較穩定,能夠看看!

 

TCP的4次斷開:

 

第一步:客戶端向服務器端發送創建鏈接請求:

FIN = 1  (沒有數據發送了,將要斷開)

seq = 1  (序列號)

第二不:服務器端響應客戶端

 ACK = 1  (客戶端不能向服務器端推送數據,可是服務器端是能夠的)

seq = 1    

ack = u+1

 

爲何是四次呢?

由於它是一個全雙方的通訊,彼此均可以發送你信息;

 

Socket鏈接 

 

 一個SOCket鏈接的Demo(基於本的 127.0.0.1, 端口號:6969):

打開一個A終端窗口輸入:

nc -l 6969 

監聽6869端口,至關於打開服務器

 

打開B終端進程窗口,輸入

nc 127.0.0.1 6969

這樣就創建通訊了,在A終端窗口輸入 123 ,回車會發現B終端進程窗口,出現123如:

B終端口:

 

Socket鏈接流程:

  Socket 是基於TCP、UDP的抽像層的。

  在這個流層中,能夠把Socket理解爲插排。它就至關於一個媒介,Socket是位於用戶層和傳輸層之間用與操做TCP和UDP的。

  Socket是IP的端口(狹義理解),能夠理解爲IP的一個端口,在Linux理解爲套接字。

 

  Socket是成對出現的,這要保證咱們的客戶端和服務器端都要有套接字Socket。

 

流程關鍵字:

  bind(): 綁定IP地址中的端口,判斷這個端口是否被佔用了,若沒佔用他會監聽這個端口號。

  listen(): 如上述的Demo中 6969 端口,監聽這個端口是阻塞線程的,一直等待客戶端的鏈接。

  accept(): 若是有客戶端的鏈接,它就會接受,鏈接完以後進行數據通訊,鏈接是基於TCP的,基於TCP的3次握手,結下來就能夠進行數據的傳輸。

  read(), write(): 進行數據的傳輸;

  close(): 發送完後,就結束鏈接。

 

  Socket與TCP的最大區別就是Socket能夠控制何時打開,何時鏈接;

  http是短鏈接,緣由是一問一答,走了以後就沒有了,TCP是短鏈接;

  Socket是長鏈接,是由於能夠手動的控制它,數據發送完了,不須要了Socket就能夠對它進行關閉;

相關文章
相關標籤/搜索