目錄:
1.TCP連接時(shí)的三次握手
2.TCP斷開(kāi)時(shí)的四次揮手
3.TCP和UDP的異同
4.TCP并發(fā)
TCP連接時(shí)的三次握手
三次握手的過(guò)程
為什么要有三次握手毛雇,因?yàn)槿绻挥袃纱挝帐旨党疲敲?br>
第一次:客戶(hù)端發(fā)送一個(gè)syn包給服務(wù)器,里面有一個(gè)隨機(jī)生成的syn灵疮,然后客戶(hù)端處于syn_send狀態(tài)
第二次:服務(wù)端收到客戶(hù)端發(fā)來(lái)的syn包之后织阅,確認(rèn)syn包,也就是生成一個(gè)ack=syn+1震捣,然后再自己隨機(jī)生成一個(gè)syn包荔棉,即syn+ack包,然后返回給客戶(hù)端蒿赢,自己變成syn_recv狀態(tài)
第三次:客戶(hù)端收到服務(wù)端發(fā)來(lái)的syn+ack包之后润樱,確認(rèn)ack是正確的之后,返回一個(gè)ack=syn+1給服務(wù)端羡棵,此包發(fā)送完畢壹若,客戶(hù)端進(jìn)入了ESTABLISHED狀態(tài),服務(wù)端收到ack包后也進(jìn)入ESTABLISHED狀態(tài)。
握手中安全問(wèn)題
SYN攻擊店展,當(dāng)?shù)诙挝帐址?wù)端發(fā)送了syn+ack包之后养篓,收到客戶(hù)端發(fā)送的ack之前這段時(shí)間的tcp鏈接成為半連接,此時(shí)服務(wù)端處于syn_recv狀態(tài)赂蕴。當(dāng)大量客戶(hù)端隨機(jī)IP瘋狂發(fā)送tcp鏈接請(qǐng)求時(shí)觉至,客戶(hù)端以為是不同用戶(hù)的請(qǐng)求,所以隊(duì)列中全是半連接睡腿,然后導(dǎo)致服務(wù)器宕機(jī)语御,正常請(qǐng)求被丟棄。
三次握手過(guò)程中出現(xiàn)丟包
第一個(gè)包發(fā)送過(guò)程丟失
A會(huì)周期性超時(shí)重傳席怪,直到收到B的確認(rèn)
第二個(gè)包發(fā)送過(guò)程丟失
B會(huì)周期性超時(shí)重傳应闯,直到收到A的確認(rèn)
第三個(gè)包發(fā)送過(guò)程丟失
A發(fā)送完數(shù)據(jù)后單方面進(jìn)入TCP的ESTABLISHED狀態(tài),B還處于半鏈接:
- 如果此時(shí)雙方都沒(méi)有數(shù)據(jù)傳輸挂捻,會(huì)進(jìn)行第二步碉纺,B會(huì)周期性超時(shí)重傳,直到收到A的確認(rèn)刻撒,然后TCP也變成ESTABLISHED骨田,雙方開(kāi)始數(shù)據(jù)傳輸。
- 如果A有數(shù)據(jù)需要發(fā)送声怔,由于A已經(jīng)單方面進(jìn)入TCP的ESTABLISHED狀態(tài)态贤,因此A直接傳輸數(shù)據(jù),B收到A的數(shù)據(jù)包+ACK包后會(huì)卻換到ESTABLISHED狀態(tài)醋火,開(kāi)始接受數(shù)據(jù)包悠汽,然后開(kāi)始數(shù)據(jù)傳輸
- 如果B有數(shù)據(jù)需要發(fā)送,由于B處于半連接狀態(tài)芥驳,數(shù)據(jù)發(fā)送不了柿冲,只會(huì)周期性超時(shí)重傳,直到收到A的確認(rèn)才會(huì)傳輸數(shù)據(jù)
為什么要三次握手
TCP斷開(kāi)時(shí)的四次揮手
四次揮手的過(guò)程
第一次:客戶(hù)端發(fā)送一個(gè)fin給服務(wù)端表示自己要斷開(kāi)連接了假抄,然后進(jìn)入fin_wait_1狀態(tài)
第二次:服務(wù)端收到fin后,發(fā)送一個(gè)ack=fin+1給客戶(hù)端丽猬,服務(wù)端進(jìn)入close_wait狀態(tài)宿饱,客戶(hù)端進(jìn)入fin_wait_2狀態(tài)
第三次:服務(wù)端發(fā)送一個(gè)fin,用來(lái)關(guān)閉服務(wù)端到客戶(hù)端的數(shù)據(jù)傳輸宝鼓,服務(wù)端進(jìn)入last_ack狀態(tài)
第四次:客戶(hù)端收到fin后刑棵,進(jìn)入time_wait狀態(tài),然后發(fā)送一個(gè)ack=fin+1給服務(wù)端愚铡,服務(wù)端確認(rèn)后進(jìn)入close狀態(tài),完成四次揮手
為什么要四次揮手
TCP協(xié)議是一種面向連接的、可靠的沥寥、基于字節(jié)流的運(yùn)輸層通信協(xié)議碍舍。TCP是全雙工模式,這就意味著邑雅,當(dāng)主機(jī)1發(fā)出FIN報(bào)文段時(shí)片橡,只是表示主機(jī)1已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了,主機(jī)1告訴主機(jī)2淮野,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了捧书;但是,這個(gè)時(shí)候主機(jī)1還是可以接受來(lái)自主機(jī)2的數(shù)據(jù)骤星;當(dāng)主機(jī)2返回ACK報(bào)文段時(shí)经瓷,表示它已經(jīng)知道主機(jī)1沒(méi)有數(shù)據(jù)發(fā)送了,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的洞难;當(dāng)主機(jī)2也發(fā)送了FIN報(bào)文段時(shí)舆吮,這個(gè)時(shí)候就表示主機(jī)2也沒(méi)有數(shù)據(jù)要發(fā)送了,就會(huì)告訴主機(jī)1队贱,我也沒(méi)有數(shù)據(jù)要發(fā)送了色冀,之后彼此就會(huì)愉快的中斷這次TCP連接。如果要正確的理解四次分手的原理柱嫌,就需要了解四次分手過(guò)程中的狀態(tài)變化锋恬。
- FIN_WAIT_1: 這個(gè)狀態(tài)要好好解釋一下,其實(shí)FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對(duì)方的FIN報(bào)文编丘。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實(shí)際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí)伶氢,它想主動(dòng)關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報(bào)文瘪吏,此時(shí)該SOCKET即進(jìn)入到FIN_WAIT_1狀態(tài)癣防。而當(dāng)對(duì)方回應(yīng)ACK報(bào)文后,則進(jìn)入到FIN_WAIT_2狀態(tài)掌眠,當(dāng)然在實(shí)際的正常情況下蕾盯,無(wú)論對(duì)方何種情況下,都應(yīng)該馬上回應(yīng)ACK報(bào)文蓝丙,所以FIN_WAIT_1狀態(tài)一般是比較難見(jiàn)到的级遭,而FIN_WAIT_2狀態(tài)還有時(shí)常常可以用netstat看到渺尘。(主動(dòng)方)
- FIN_WAIT_2:上面已經(jīng)詳細(xì)解釋了這種狀態(tài)挫鸽,實(shí)際上FIN_WAIT_2狀態(tài)下的SOCKET,表示半連接鸥跟,也即有一方要求close連接丢郊,但另外還告訴對(duì)方盔沫,我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你(ACK信息),稍后再關(guān)閉連接枫匾。(主動(dòng)方)
- CLOSE_WAIT:這種狀態(tài)的含義其實(shí)是表示在等待關(guān)閉架诞。怎么理解呢?當(dāng)對(duì)方close一個(gè)SOCKET后發(fā)送FIN報(bào)文給自己干茉,你系統(tǒng)毫無(wú)疑問(wèn)地會(huì)回應(yīng)一個(gè)ACK報(bào)文給對(duì)方谴忧,此時(shí)則進(jìn)入到CLOSE_WAIT狀態(tài)。接下來(lái)呢角虫,實(shí)際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對(duì)方沾谓,如果沒(méi)有的話(huà),那么你也就可以 close這個(gè)SOCKET戳鹅,發(fā)送FIN報(bào)文給對(duì)方均驶,也即關(guān)閉連接。所以你在CLOSE_WAIT狀態(tài)下粉楚,需要完成的事情是等待你去關(guān)閉連接辣恋。(被動(dòng)方)
- LAST_ACK: 這個(gè)狀態(tài)還是比較容易好理解的,它是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后模软,最后等待對(duì)方的ACK報(bào)文伟骨。當(dāng)收到ACK報(bào)文后,也即可以進(jìn)入到CLOSED可用狀態(tài)了燃异。(被動(dòng)方)
- TIME_WAIT: 表示收到了對(duì)方的FIN報(bào)文携狭,并發(fā)送出了ACK報(bào)文,就等2MSL后即可回到CLOSED可用狀態(tài)了回俐。如果FINWAIT1狀態(tài)下逛腿,收到了對(duì)方同時(shí)帶FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí),可以直接進(jìn)入到TIME_WAIT狀態(tài)仅颇,而無(wú)須經(jīng)過(guò)FIN_WAIT_2狀態(tài)单默。(主動(dòng)方)
- CLOSED: 表示連接中斷。
TCP和UDP的異同
? | TCP | UDP |
---|---|---|
是否連接 | 面向連接 | 面向非連接 |
傳輸可靠性 | 可靠 | 不可靠 |
應(yīng)用場(chǎng)合 | 少量數(shù)據(jù) | 大量數(shù)據(jù) |
速度 | 慢 | 快 |
數(shù)據(jù)正確性 | 保證 | 可能丟包 |
數(shù)據(jù)順序 | 保證 | 不保證 |
TCP并發(fā)
- 網(wǎng)頁(yè)中的圖片資源為什么分放在不同的域名下忘瓦?
- 瀏覽器與服務(wù)器建立一個(gè)TCP連接后搁廓,是否會(huì)在完成一個(gè)http請(qǐng)求后斷開(kāi)?什么條件下會(huì)斷開(kāi)耕皮?
- 一個(gè)TCP連接可以同時(shí)發(fā)送幾個(gè)HTTP請(qǐng)求境蜕?
- 瀏覽器http請(qǐng)求的并發(fā)性是如何體現(xiàn)的?并發(fā)請(qǐng)求的數(shù)量有沒(méi)有限制凌停?
答案解析:
1.網(wǎng)頁(yè)中的圖片資源為什么分放在不同的域名下?
瀏覽器對(duì)并發(fā)請(qǐng)求的數(shù)目限制是針對(duì)域名的粱年,即針對(duì)同一域名(包括二級(jí)域名)在同一時(shí)間支持的并發(fā)請(qǐng)求數(shù)量的限制。如果請(qǐng)求數(shù)目超出限制罚拟,則會(huì)阻塞台诗。因此完箩,網(wǎng)站中對(duì)一些靜態(tài)資源,使用不同的一級(jí)域名拉庶,可以提升瀏覽器并行請(qǐng)求的數(shù)目嗜憔,加速界面資源的獲取速度秃励。
2.瀏覽器與服務(wù)器建立一個(gè)TCP連接后氏仗,是否會(huì)在完成一個(gè)http請(qǐng)求后斷開(kāi)?什么條件下會(huì)斷開(kāi)夺鲜?
在HTTP/1.0
中皆尔,一個(gè)http請(qǐng)求收到服務(wù)器響應(yīng)后,會(huì)斷開(kāi)對(duì)應(yīng)的TCP連接币励。這樣每次請(qǐng)求慷蠕,都需要重新建立TCP連接,這樣一直重復(fù)建立和斷開(kāi)的過(guò)程食呻,比較耗時(shí)流炕。所以為了充分利用TCP連接,可以設(shè)置頭字段Connection: keep-alive
仅胞,這樣http請(qǐng)求完成后每辟,就不會(huì)斷開(kāi)當(dāng)前的TCP連接,后續(xù)的http請(qǐng)求可以使用當(dāng)前TCP連接進(jìn)行通信干旧。
第一次訪問(wèn)有初始化連接和SSL開(kāi)銷(xiāo)
初始化連接和SSL開(kāi)銷(xiāo)消失了渠欺,說(shuō)明使用的是同一個(gè)TCP連接。
HTTP/1.1
將Connection
寫(xiě)入了標(biāo)準(zhǔn)椎眯,默認(rèn)值為keep-alive
挠将。除非強(qiáng)制設(shè)置為Connection: close
,才會(huì)在請(qǐng)求后斷開(kāi)TCP連接编整。
所以這一題的答案就是:默認(rèn)情況下建立的TCP連接不會(huì)斷開(kāi)舔稀,只有在請(qǐng)求頭中設(shè)置Connection: close
才會(huì)在請(qǐng)求后關(guān)閉TCP連接。
3.一個(gè)TCP連接可以同時(shí)發(fā)送幾個(gè)HTTP請(qǐng)求掌测?
HTTP/1.1
中内贮,單個(gè)TCP連接,在同一時(shí)間只能處理一個(gè)http請(qǐng)求赏半,雖然存在Pipelining技術(shù)支持多個(gè)請(qǐng)求同時(shí)發(fā)送贺归,但由于實(shí)踐中存在很多問(wèn)題無(wú)法解決,所以瀏覽器默認(rèn)是關(guān)閉断箫,所以可以認(rèn)為是不支持同時(shí)多個(gè)請(qǐng)求拂酣。
HTTP2
提供了多路傳輸功能,多個(gè)http請(qǐng)求仲义,可以同時(shí)在同一個(gè)TCP連接中進(jìn)行傳輸婶熬。
4.瀏覽器http請(qǐng)求的并發(fā)性是如何體現(xiàn)的剑勾?并發(fā)請(qǐng)求的數(shù)量有沒(méi)有限制?
頁(yè)面資源請(qǐng)求時(shí)赵颅,瀏覽器會(huì)同時(shí)和服務(wù)器建立多個(gè)TCP連接虽另,在同一個(gè)TCP連接上順序處理多個(gè)HTTP請(qǐng)求。所以瀏覽器的并發(fā)性就體現(xiàn)在可以建立多個(gè)TCP連接饺谬,來(lái)支持多個(gè)http同時(shí)請(qǐng)求捂刺。
Chrome瀏覽器最多允許對(duì)同一個(gè)域名Host建立6個(gè)TCP連接,不同的瀏覽器有所區(qū)別募寨。
補(bǔ)充
如果圖片都是HTTPS的連接族展,并且在同一域名下,瀏覽器會(huì)先和服務(wù)器協(xié)商使用HTTP2
的Multiplexing
功能進(jìn)行多路傳輸拔鹰,不過(guò)未必所有的掛在這個(gè)域名下的資源都會(huì)使用同一個(gè)TCP連接仪缸。如果用不了HTTPS或者HTTP2(HTTP2是在HTTPS上實(shí)現(xiàn)的),那么瀏覽器會(huì)就在同一個(gè)host建立多個(gè)TCP連接列肢,每一個(gè)TCP連接進(jìn)行順序請(qǐng)求資源恰画。