1. 介紹TCP連接的三次握手?追問:為什么TCP需要握手三次?
三次握手:
- 第一步:A向B發送一個SYN報文表示希望建立連接
- 第二步:B收到A發過來的數據包后,通過SYN得知這是一個建立連接的請求,于是發送ACK確認,由于TCP的全雙工模式,故B向A還應該發送一個SYN報文,表示希望和A建立連接
- 第三步:A收到B發送來的SYN報文后,A向B發送ACK表示A收到了B的SYN。
追問:
- 保證雙方都具有接受和發送報文的能力
- 防止請求超時導致臟連接
因為報文生存時間可能會超過TCP請求超時時間,假如兩次握手就可以建立連接,A的報文由于一些問題滯留在網絡中,當報文超時但被釋放連接后,此超時連接傳輸到B,B以為是A創建連接的新請求,然后確認連接。但是A知道這是超時連接的,所以直接丟棄了B的確認數據,導致只是B單方面建立了連接。并一直等待A發送數據,B的資源也就浪費了。
2. 介紹TCP斷開的四次揮手?追問:為什么TCP的揮手需要四次
四次揮手:
- 第一步:A向B發送FIN和ACK報文表示希望斷開連接
- 第二步:B收到A發送的請求后會發送ACK表示確認斷開。
- 第三步:此時B處于半連接狀態,B會發送FIN和ACK請求斷開與A之間的連接
- 第四步:A收到B發送的斷開請求會發送ACK表示確認斷開
追問:
- 確保數據能夠全部傳輸完成
- 四次才能保證所有的連接全部斷
3. 為什么連接的時候是三次,揮手的時候是四次?
一問:
(1) 假設連接的時候是兩次,那么A滯留在網絡中的報文經過一段時間傳輸到B,B會確認此連接。B單方面建立了連接,A會丟棄B的確認數據報文。B會一直等待A發送數據,造成B資源的浪費。
官方解釋:
兩次:不能,為了防止已經失效的
(2) 我們知道三次,雙方已經建立了連接,四次完全沒有必要
二問:
確保數據能夠全部傳輸完成
A發送FIN后,B有可能正在向A傳輸數據,所以不會馬上關閉,當數據全部傳輸完成后再發送ACK表示確認斷開。
4. TCP的syn攻擊的過程?追問:怎么防御?
攻擊原理:
B收到SYN報文后,會將相應的半連接記錄添加到隊列中,之后等待接收握手包,如果握手成功就會將此半連接記錄從隊列中刪除;或者當B未收到A的確認包,會重新發送請求包,直到超時才會將此條記錄從半連接隊列刪除。
服務器的TCP協議棧中存儲的半連接記錄是有限的,當服務器接收到SYN型的DOS攻擊后,隊列會很快充滿,客戶端在短時間內偽造大量的不存在的IP地址,向服務器不斷發送SYN報文,服務器回復確認包,并等待客戶的確認,由于源地址是不存在的,服務器需要不斷的重發直至超時,這些偽造的SYN包將長時間占用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢嚴重者引起網絡堵塞甚至系統癱瘓,服務器隨后就不再接受新的網絡連接,從而造成正常的客戶端無法訪問服務器的情況發生。
防御:
- 增大隊列SYN最大半連接數,linux中最大連接數為256
- 減少半連接時的超時時間
- 過濾可疑地址
- 利用SYN cookie防御DOS攻擊
SYN Cookie是用一個Cookie來響應TCPSYN請求的,在正常的TCP連接過程中,當服務器接收一個SYN數據包,就會返回一個SYN-ACK包來應答,半開放連接狀態來等待最后返回的ACK包。服務器用一個數據空間來描述所有未解決的連接,然而這個數據空間的大小是有限的,所以攻擊者將塞滿這個空間,在SYN Cookie的執行過程中,當服務器收到一個SYN包的時候,他返回一個SYN -ACK包,這個數據包的ACK序列號是經過加密的,它由TCP連接的源地址和端口號、目標地址和端口號以及一個加密種子經過HASH計算得出的,然后服務器釋放所有的狀態。如果一個ACK包從客戶端返回后,服務器重新計算Cookie來判斷它是不是上個SYN-ACK的返回包。如果是的話,服務器就可以直接進入TCP連接狀態并打開連接。這樣服務器就可以避免守候半開放連接了
5. 什么是滑動窗口?追問:為什么會出現滑動窗口?
滑動窗口:
用來告訴發送端可以發送數據的大小或者說是窗口標記了接收端緩沖區的大小。窗口指一次批量發送多少數據。
為何會出現滑動窗口:
在確認應答的策略中,每發送一次數據段都需要一個ACK確認應答,收到ACK后再發送下一個數據段,這樣每次都需要確認,性能較差。采用滑動窗口的機制就會一次發送多條數據,提高傳輸性能
6. TCP是如何通過滑動窗口協議實現流量控制和擁塞控制的?
通過設置滑動窗口的大小,用ACK告知發送端自己緩存區的大小,從而使發送端以合適的速度發送,實現流量控制;
發送端根據網絡擁塞情況確定的窗口值。發送端在真正確定發送窗口時,應該取“通知窗口”和“擁塞窗口”的最小值。
7. 描述TCP和UDP的區別?
UDP:
- 無連接的,即發送數據之前不需要建立連接
- 不保證可靠的交付,同時不使用擁塞控制
- U支持一對一、一對多、多對一、多對多的交互通信
- 首部只有8字節
TCP:
- 面向連接的傳輸層協議
- 提供可靠的交付能力
- 僅支持一對一通信
- 支持全雙工通信(允許數據在兩個方向上同時傳輸)
- 首部最低有20字節
問題:如何用UDP實現可好傳輸?
引入序列號保證數據的順序、確認機制保證數據能到達對端、重傳機制保證超時引起的數據丟棄。
8. TCP有哪些定時器?
- 重傳定時器
- 堅持定時器
- 保活定時器
- 時間等待定時器
9. 什么是CDN,CDN是如何工作的?
一問:CDN是內容分發網絡
二問:CDN是在用戶和服務器之間增加高速緩存層,通過接管DNS實現,將用戶的請求引導到高速緩存服務器上獲取源服務器的數據
10. 什么是DNS?說說DNS解析過程?
一問:DNS為域名系統,是因特網上作為域名和IP地址相互映射的分布式數據庫
二問:
- 瀏覽器檢查緩存中有沒有這個域名對應的解析過的ip地址,如果有該解析過程將會結束。
- 檢查本地的hosts文件是否有這個網址映射關系
- 如果hosts種沒有這個域名映射,查找本地DNS解析器緩存,如果有直接返回
- 通過首選DNS服務器(本地域名服務器),以遞歸或循環的方式查詢域名對應的IP地址并返回。(頂級域,二級域,三級域)