要記網絡層的5層協議,能夠把它想像爲一枚洋蔥。學過計算機網絡的,看到這個網絡協議的套接字,大概就會明白了!它是一層一層的進行包裹的,而後交由物理層進行發送的。在網絡七層的基礎上,將應用層、表達層、會話層合併爲應用層了。面試
簡潔版:服務器
第一次:客戶端向服務器端發送請求網絡
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次客戶端向服務器端發送請求由於阻塞,客戶端會再次給服務器端發送請求,此次服務器端和客戶端創建了鏈接。這樣雙方就能夠發送數據了,發送完之後就能夠斷開鏈接了。可是這是阻塞的請求到了服務器端,這時會創建第二次鏈接。可是客戶端的數據發送完了,形成了資源的浪費。
因此第三次是爲了再次確認,避免資源的浪費。
網易,騰訊,青牛的比較穩定,能夠看看!
第一步:客戶端向服務器端發送創建鏈接請求:
FIN = 1 (沒有數據發送了,將要斷開)
seq = 1 (序列號)
第二不:服務器端響應客戶端
ACK = 1 (客戶端不能向服務器端推送數據,可是服務器端是能夠的)
seq = 1
ack = u+1
爲何是四次呢?
由於它是一個全雙方的通訊,彼此均可以發送你信息;
一個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 是基於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就能夠對它進行關閉;