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