1.TCP的三次握手與四次揮手過(guò)程,各個(gè)狀態(tài)名稱與含義,TIMEWAIT的作用
2.TCP和UDP的區(qū)別
TCP是有連接的,兩臺(tái)主機(jī)在進(jìn)行數(shù)據(jù)交互之前必須先通過(guò)三次握手建立連接;而UDP是無(wú)連接的,沒(méi)有建立連接這個(gè)過(guò)程
TCP是可靠的傳輸,TCP協(xié)議通過(guò)確認(rèn)和重傳機(jī)制來(lái)保證數(shù)據(jù)傳輸?shù)目煽啃?;而UDP是不可靠的傳輸
TCP還提供了擁塞控制、滑動(dòng)窗口等機(jī)制來(lái)保證傳輸?shù)馁|(zhì)量,而UDP都沒(méi)有
TCP是基于字節(jié)流的,將數(shù)據(jù)看做無(wú)結(jié)構(gòu)的字節(jié)流進(jìn)行傳輸,當(dāng)應(yīng)用程序交給TCP的數(shù)據(jù)長(zhǎng)度太長(zhǎng),超過(guò)MSS時(shí),TCP就會(huì)對(duì)數(shù)據(jù)進(jìn)行分段,因此TCP的數(shù)據(jù)是無(wú)邊界的;而UDP是面向報(bào)文的,無(wú)論應(yīng)用程序交給UDP層多長(zhǎng)的報(bào)文,UDP都不會(huì)對(duì)數(shù)據(jù)報(bào)進(jìn)行任何拆分等處理,因此UDP保留了應(yīng)用層數(shù)據(jù)的邊界
3.三次握手過(guò)程中有哪些不安全性
1)偽裝的IP向服務(wù)器發(fā)送一個(gè)SYN請(qǐng)求建立連接,然后服務(wù)器向該IP回復(fù)SYN和ACK,但是找不到該IP對(duì)應(yīng)的主機(jī),當(dāng)超時(shí)時(shí)服務(wù)器收不到ACK會(huì)重復(fù)發(fā)送。當(dāng)大量的攻擊者請(qǐng)求建立連接時(shí),服務(wù)器就會(huì)存在大量未完成三次握手的連接,服務(wù)器主機(jī)backlog被耗盡而不能響應(yīng)其它連接。即SYN泛洪攻擊
防范措施:
1、降低SYN timeout時(shí)間,使得主機(jī)盡快釋放半連接的占用
2、采用SYN cookie設(shè)置,如果短時(shí)間內(nèi)連續(xù)收到某個(gè)IP的重復(fù)SYN請(qǐng)求,則認(rèn)為受到了該IP的攻擊,丟棄來(lái)自該IP的后續(xù)請(qǐng)求報(bào)文
3、在網(wǎng)關(guān)處設(shè)置過(guò)濾,拒絕將一個(gè)源IP地址不屬于其來(lái)源子網(wǎng)的包進(jìn)行更遠(yuǎn)的路由
2)當(dāng)一個(gè)主機(jī)向服務(wù)器發(fā)送SYN請(qǐng)求連接,服務(wù)器回復(fù)ACK和SYN后,攻擊者截獲ACK和SYN。然后偽裝成原始主機(jī)繼續(xù)與服務(wù)器進(jìn)行通信。
4.accept發(fā)生在三次握手的哪一步
????????accept會(huì)監(jiān)聽(tīng)已完成隊(duì)列是否非空,當(dāng)隊(duì)列為空時(shí),accept就會(huì)阻塞。當(dāng)隊(duì)列非空時(shí),就從已完成隊(duì)列中取出一項(xiàng)并返回。?
而已完成隊(duì)列中的都是三次握手過(guò)程已經(jīng)完成的,因此accept發(fā)生在三次握手之后。?
5.TCP在listen時(shí)的參數(shù)backlog的意義
linux內(nèi)核中會(huì)維護(hù)兩個(gè)隊(duì)列:
1)未完成隊(duì)列:接收到一個(gè)SYN建立連接請(qǐng)求,處于SYN_RCVD狀態(tài)
2)已完成隊(duì)列:已完成TCP三次握手過(guò)程,處于ESTABLISHED狀態(tài)
當(dāng)有一個(gè)SYN到來(lái)請(qǐng)求建立連接時(shí),就在未完成隊(duì)列中新建一項(xiàng)。當(dāng)三次握手過(guò)程完成后,就將套接口從未完成隊(duì)列移動(dòng)到已完成隊(duì)列。
backlog曾被定義為兩個(gè)隊(duì)列的總和的最大值,也曾將backlog的1.5倍作為未完成隊(duì)列的最大長(zhǎng)度
一般將backlog指定為5
6.TCP選項(xiàng)有哪些
TCP首部選項(xiàng)字段多達(dá)40B,一些常用的字段有:
1)選項(xiàng)結(jié)束字段(EOP,0x00),占1B,一個(gè)報(bào)文段僅用一次。放在末尾用于填充,用途是說(shuō)明:首部已經(jīng)沒(méi)有更多的消息,應(yīng)用數(shù)據(jù)在下一個(gè)32位字開(kāi)始處
2)無(wú)操作字段(NOP, 0x01),占1B,也用于填充,放在選項(xiàng)的開(kāi)頭
3)MSS(最大報(bào)文段長(zhǎng)度),格式如下:種類(1B,值為2),長(zhǎng)度(1B,值為4),數(shù)值(2B)
用于在連接開(kāi)始時(shí)確定MSS的大小,如果沒(méi)有確定,就用默認(rèn)的(一般實(shí)現(xiàn)是536B)
4)窗口擴(kuò)大因子,格式如下:種類(1B,值為3),長(zhǎng)度(1B,值為3),數(shù)值(1B)
新窗口值 = 首部窗口值 * 2的(擴(kuò)大因子)次方
當(dāng)通信雙方認(rèn)為首部的窗口值還不夠大的時(shí)候,在連接開(kāi)始時(shí)用這個(gè)來(lái)定義更大的窗口。僅在連接開(kāi)始時(shí)有效。一經(jīng)定義,通信過(guò)程中無(wú)法更改。
5)時(shí)間戳(應(yīng)用測(cè)試RTT和防止序號(hào)繞回)
6)允許SACK和SACK選項(xiàng)
7.為什么建立連接需要三次握手,而斷開(kāi)連接需要四次握手
因?yàn)槊總€(gè)方向都需要一個(gè)FIN和ACK,當(dāng)一端發(fā)送了FIN包之后,處于半關(guān)閉狀態(tài),此時(shí)仍然可以接收數(shù)據(jù)包。
在建立連接時(shí),服務(wù)器可以把SYN和ACK放在一個(gè)包中發(fā)送。
但是在斷開(kāi)連接時(shí),如果一端收到FIN包,但此時(shí)仍有數(shù)據(jù)未發(fā)送完,此時(shí)就需要先向?qū)Χ嘶貜?fù)FIN包的ACK。等到將剩下的數(shù)據(jù)都發(fā)送完之后,再向?qū)Χ税l(fā)送FIN,斷開(kāi)這個(gè)方向的連接。
因此很多時(shí)候FIN和ACK需要在兩個(gè)數(shù)據(jù)包中發(fā)送,因此需要四次握手
8.超時(shí)重傳和快速重傳
超時(shí)重傳:當(dāng)超時(shí)時(shí)間到達(dá)時(shí),發(fā)送方還未收到對(duì)端的ACK確認(rèn),就重傳該數(shù)據(jù)包
快速重傳:當(dāng)后面的序號(hào)先到達(dá),如接收方接收到了1、 3、 4,而2沒(méi)有收到,就會(huì)立即向發(fā)送方重復(fù)發(fā)送三次ACK=2的確認(rèn)請(qǐng)求重傳。如果發(fā)送方連續(xù)收到3個(gè)相同序號(hào)的ACK,就重傳該數(shù)據(jù)包。而不用等待超時(shí)