面试盲区TCP/SOCKET/三次握手 - 笔记
七層協議
簡化為五層協議
Java NIO Channel:在Java中,輸入、輸出流被合并成為Channel(通道可以讀也可以寫,而流一般來說是單向的,只能讀或者寫,所以之前我們用流進行IO操作的時候需要分別創建一個輸入流和一個輸出流)
下圖可以想象為8就是一個Channel,和百度了建立一個連接。
8指向一個開啟的socket,8就是文件描述符
<>表示輸入輸出(重定向)
fd類似于java當中的變量引用
exec命令解釋如下:
exec是一個shell builtin的指令,相當于shell的一個本地方法
例如,執行一個exec ls命令之后,ls命令會替換當前的shell外殼程序,直到ls退出,ls所在的線程就會消亡。
下圖可以看到,執行一個exec ls命令,當ls命令退出后,shell也退出了,連接斷開了
在Linux中,一切皆文件,可以看到,建立起的socket也是以一個文件的形式存在的。
請求百度主頁,用的是Http協議。
(下圖第一行)首先,人工拼接一個字符串,發給百度(-e用來識別轉義字符換行符\n),整句含義為:讓8指向一個輸入輸出(雙向流),指向一個socket,綁定到一個百度的連接
(如果建立連接太長時間,不做任何操作的話,百度服務器會自動把連接關掉。除非做心跳去保持連接)
(上圖倒數第二行)然后,如下圖所示命令,將echo的標準輸出重定向到8,仍然用8接收返回的輸入流
返回內容
ls 也有標準輸出 0,1,2,可以被重定向
>是重定向符號,使用方式如下所示
以上是用戶層(應用層)做的。用戶層給出命令之后,剩下的交由內核層(傳輸控制層,網絡層,鏈路層,物理層)來做。
傳輸層協議:TCP,UDP
TCP協議:面向連接的,可靠的傳輸協議
TCP的三次握手:客戶端要和服務端建立連接的過程,如下
三次握手之后,雙方才會有服務資源(C結構體、緩沖區)的開辟,才會產生連接,即“面向連接”。
Socket:套接字,是成對出現的(分別是連接一端的IP:port和另一端的IP:port)
ip定位到主機,端口號定位到應用程序
服務端是明確要占用的,只需要開啟一個度固定的端口號
客戶端的端口號是隨機的
同一個端口號,可以連接很多個不同的目標端口(不存在端口被占用沖突的問題,因為可以這樣想,一個80端口可以建立好多個連接,是吧)
也就是說,即使65535個端口都用來和www.baidu.com建立連接了,此時這65535個端口仍然可以和www.qq.com建立連接,不會沖突。
四次分手:雙方都要確認斷開連接
使用tcpdump監聽(抓包),可以看到三次握手、四次揮手的過程
三次握手到四次分手不可被分割!-> 高并發負載均衡LVS 4 負載均衡服務器
DDos攻擊:用一堆肉雞,發一堆握手請求,不給回復確認,讓服務器等待(一段時間才會斷開),導致真正的請求無法進入
網絡層
鏈路層
MAC地址在每一跳都是不斷被重新封裝,變化的。
總結
以上是生活随笔為你收集整理的面试盲区TCP/SOCKET/三次握手 - 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】强软弱虚四种引用,弱引用在T
- 下一篇: 【jQuery】使用jquery.for