不詩(shī)意的女程序媛不是好廚師~
轉(zhuǎn)載請(qǐng)注明出處壮韭,F(xiàn)rom李詩(shī)雨---https://blog.csdn.net/cjm2484836553/article/details/103930596
網(wǎng)絡(luò)架構(gòu)量没,可以算得上是面試的寵兒了,我也廢話不多說(shuō),直接上重點(diǎn)页滚。
1.計(jì)算機(jī)網(wǎng)絡(luò)分層▲(面試點(diǎn))
1.1 OSI七層網(wǎng)絡(luò)模型 和 TCP/IP參考模型
- 重點(diǎn)1:OSI七層網(wǎng)絡(luò)模型 和 TCP/IP參考模型 崔步,它可是面試的敲門(mén)磚,所以大概的內(nèi)容要記住娱俺。
(PS:作為貼心小棉襖的我稍味,已經(jīng)畫(huà)了個(gè)好看的圖,方便大家背誦~)
關(guān)于OSI模型 和 TCP/IP模型荠卷,大家可以這么理解模庐。
OSI七層模型 偏向于一種 理想化的,就好比學(xué)術(shù)界定義的油宜。而TCP/IP四層模型掂碱,則是工業(yè)界中實(shí)際使用的。
-
重點(diǎn)2: 大家要知道 TCP/IP是一組協(xié)議的代名詞验庙,它還包括許多協(xié)議顶吮,組成了TCP/IP協(xié)議簇。
從字面上來(lái)看粪薛,有人可能會(huì)認(rèn)為 TCP/IP 是指 TCP 和 IP 兩種協(xié)議悴了。實(shí)際生活當(dāng)中,有時(shí)也確實(shí)就是指這兩種協(xié)議。但是在很多情況下湃交,它只是利用 IP 進(jìn)行通信時(shí)所必須用到的協(xié)議群的統(tǒng)稱(chēng)熟空。具體來(lái)說(shuō),IP 或 ICMP搞莺、TCP 或 UDP息罗、TELNET 或 FTP、以及 HTTP 等都屬于 TCP/IP 協(xié)議才沧。
此外我們還要知道迈喉,在TCP/IP協(xié)議簇中, IP位于網(wǎng)絡(luò)層温圆,TCP位于傳輸層挨摸,HTTP位于應(yīng)用層。
2.IP地址 和 端口號(hào)
這里有2個(gè)概念需要我們來(lái)解釋一下岁歉,因?yàn)樵诿嬖囍灰灿锌赡軙?huì)提到得运。
2.1 IP地址
為了實(shí)現(xiàn)網(wǎng)絡(luò)中不同終端之間的通信,每個(gè)終端必須有一個(gè)唯一的表示锅移,它就是IP地址熔掺。
-
所以,如果問(wèn) 兩臺(tái)終端是如何通過(guò)網(wǎng)絡(luò)進(jìn)行通信的非剃?
那你要知道答案是 IP地址置逻。
可不是MAC地址哈,因?yàn)閙ac地址只在局域網(wǎng)有效备绽,不能出局域網(wǎng)诽偷。
2.2 端口號(hào)?(暗涉一道面試題)
我們可以把端口號(hào),理解為門(mén)牌號(hào)疯坤。
通過(guò)ip地址,我們可以知道我們要訪問(wèn)的是哪臺(tái)計(jì)算機(jī)深浮。但是一臺(tái)計(jì)算機(jī)可以同時(shí)運(yùn)行多個(gè)程序压怠,我們?nèi)绾沃酪L問(wèn)哪個(gè)應(yīng)用程序呢?這就要通過(guò)端口號(hào)了飞苇。
端口號(hào)用來(lái)識(shí)別同一臺(tái)計(jì)算機(jī)中進(jìn)行通信的不同應(yīng)用程序菌瘫。因此,它也被稱(chēng)為程序地址布卡。
端口號(hào)規(guī)定為16位雨让,即允許一個(gè)IP主機(jī)有2的16次方65535個(gè)不同的端口。其中:
-
0~1023:分配給系統(tǒng)的端口號(hào)
我們不可以亂用!!
常用協(xié)議使用的端口:HTTP:80忿等,F(xiàn)TP:21栖忠,TELNET:23 -
1024~49151:登記端口號(hào),主要是讓第三方應(yīng)用使用
但是必須在IANA(互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))按照規(guī)定手續(xù)登記,
49152~65535:短暫端口號(hào)庵寞,是留給客戶(hù)進(jìn)程選擇暫時(shí)使用狸相,一個(gè)進(jìn)程使用完就可以供其他進(jìn)程使用。
在Socket使用時(shí)捐川,可以用1024~65535的端口號(hào)
?那這里就隱藏了一個(gè)面試題:
既然一個(gè)ip主機(jī)的端口只有65535個(gè)脓鹃,那為什么可以做到有幾百萬(wàn)的socket鏈接呢?
哈哈古沥,這是因?yàn)槿秤遥覀兊耐ㄐ挪皇怯?端口號(hào) 一人決定的呀。我們的通信識(shí)別一個(gè)通信 是由 5元組 (源IP地址岩齿、目標(biāo)IP地址太颤、源端口號(hào)、目標(biāo)端口 和 協(xié)議號(hào))來(lái)一起決定的纯衍。
如圖:
① 和② 的通信是在兩臺(tái)計(jì)算機(jī)上進(jìn)行的栋齿。它們的目標(biāo)端口號(hào)相同,都是80襟诸。這里可以根據(jù)源端口號(hào)加以區(qū)分瓦堵。
① 和③ 的目標(biāo)端口號(hào)和源端口號(hào)完全相同,但它們各自的源 IP 地址不同歌亲。
此外菇用,當(dāng) IP 地址和端口號(hào)全都一樣時(shí),我們還可以通過(guò)協(xié)議號(hào)來(lái)區(qū)分(TCP 和 UDP)陷揪。
3. TCP和UDP
TCP/IP 中有兩個(gè)具有代表性的傳輸層協(xié)議惋鸥,分別是 TCP 和 UDP。
3.1 TCP的定義和特點(diǎn)
-
定義:Transmission Control Protocol悍缠,即傳輸控制協(xié)議卦绣,是一種傳輸層通信協(xié)議
基于TCP的應(yīng)用層協(xié)議有FTP、Telnet飞蚓、SMTP滤港、HTTP、POP3與DNS趴拧。
-
特點(diǎn):面向連接溅漾、面向字節(jié)流、全雙工通信著榴、可靠
- 面向連接:指的是要使用TCP傳輸數(shù)據(jù)添履,必須先建立TCP連接,傳輸完成后釋放連接脑又,就像打電話一樣必須先撥號(hào)建立一條連接暮胧,打完后掛機(jī)釋放連接锐借。
- 全雙工通信:即一旦建立了TCP連接,通信雙方可以在任何時(shí)候都能發(fā)送數(shù)據(jù)叔壤。
- 可靠的:指的是通過(guò)TCP連接傳送的數(shù)據(jù)瞎饲,無(wú)差錯(cuò),不丟失炼绘,不重復(fù)嗅战,并且按序到達(dá)。
- 面向字節(jié)流:流俺亮,指的是流入到進(jìn)程或從進(jìn)程流出的字符序列驮捍。簡(jiǎn)單來(lái)說(shuō),雖然有時(shí)候要傳輸?shù)臄?shù)據(jù)流太大脚曾,TCP報(bào)文長(zhǎng)度有限制东且,不能一次傳輸完,要把它分為好幾個(gè)數(shù)據(jù)塊本讥,但是由于可靠性保證珊泳,接收方可以按順序接收數(shù)據(jù)塊然后重新組成分塊之前的數(shù)據(jù)流,所以TCP看起來(lái)就像直接互相傳輸字節(jié)流一樣拷沸,面向字節(jié)流色查。
3.2 UDP的定義和特點(diǎn)
-
定義:User Datagram Protocol,即用戶(hù)數(shù)據(jù)報(bào)協(xié)議撞芍,是一種傳輸層通信協(xié)議秧了。
基于UDP的應(yīng)用層協(xié)議有TFTP、SNMP與DNS序无。
-
特點(diǎn):無(wú)連接的验毡、不可靠的、面向報(bào)文帝嗡、沒(méi)有擁塞控制
- 無(wú)連接的:和TCP要建立連接不同晶通,UDP傳輸數(shù)據(jù)不需要建立連接,就像寫(xiě)信哟玷,在信封寫(xiě)上收信人名稱(chēng)录择、地址就可以交給郵局發(fā)送了,至于能不能送到碗降,就要看郵局的送信能力和送信過(guò)程的困難程度了。
- 不可靠的:因?yàn)閁DP發(fā)出去的數(shù)據(jù)包發(fā)出去就不管了塘秦,不管它會(huì)不會(huì)到達(dá)讼渊,所以很可能會(huì)出現(xiàn)丟包現(xiàn)象,使傳輸?shù)臄?shù)據(jù)出錯(cuò)尊剔。
- 面向報(bào)文:數(shù)據(jù)報(bào)文爪幻,就相當(dāng)于一個(gè)數(shù)據(jù)包,應(yīng)用層交給UDP多大的數(shù)據(jù)包,UDP就照樣發(fā)送挨稿,不會(huì)像TCP那樣拆分仇轻。
- 沒(méi)有擁塞控制:擁塞顽悼,是指到達(dá)通信子網(wǎng)中某一部分的分組數(shù)量過(guò)多别凹,使得該部分網(wǎng)絡(luò)來(lái)不及處理,以致引起這部分乃至整個(gè)網(wǎng)絡(luò)性能下降的現(xiàn)象花椭,嚴(yán)重時(shí)甚至?xí)?dǎo)致網(wǎng)絡(luò)通信業(yè)務(wù)陷入停頓臭家,即出現(xiàn)死鎖現(xiàn)象疲陕,就像交通堵塞一樣。TCP建立連接后如果發(fā)送的數(shù)據(jù)因?yàn)樾诺蕾|(zhì)量的原因不能到達(dá)目的地钉赁,它會(huì)不斷重發(fā)蹄殃,有可能導(dǎo)致越來(lái)越塞,所以需要一個(gè)復(fù)雜的原理來(lái)控制擁塞你踩。而UDP就沒(méi)有這個(gè)煩惱诅岩,發(fā)出去就不管了。
應(yīng)用場(chǎng)景
很多的實(shí)時(shí)應(yīng)用(如IP電話带膜、實(shí)時(shí)視頻會(huì)議吩谦、某些多人同時(shí)在線游戲等)要求源主機(jī)以很定的速率發(fā)送數(shù)據(jù),并且允許在網(wǎng)絡(luò)發(fā)生擁塞時(shí)候丟失一些數(shù)據(jù)钱慢,但是要求不能有太大的延時(shí)逮京,UDP就剛好適合這種要求。
? TCP 和 UDP 的優(yōu)缺點(diǎn)無(wú)法簡(jiǎn)單地束莫、絕對(duì)地去做比較:TCP 用于在傳輸層有必要實(shí)現(xiàn)可靠傳輸?shù)那闆r懒棉;而在一方面,UDP 主要用于那些對(duì)高速傳輸和實(shí)時(shí)性有較高要求的通信或廣播通信览绿。TCP 和 UDP 應(yīng)該根據(jù)應(yīng)用的目的按需使用策严。
在說(shuō)TCP的三次握手和四次揮手之前,我們還有必要來(lái)了解一下TCP的報(bào)文結(jié)構(gòu)饿敲,因?yàn)槠渲械膸讉€(gè)字段有助于我們更好的理解三次握手和四次揮手的過(guò)程妻导。
4. TCP報(bào)文結(jié)構(gòu)
我屬于那種用到什么才學(xué)點(diǎn)什么的懶加載式學(xué)習(xí),因?yàn)閷W(xué)多了我也記不住
所以這里我就挑幾個(gè)重要字段來(lái)記錄一下:
(1)序號(hào):即seq序號(hào)(Sequence number)怀各,占32位倔韭,用來(lái)標(biāo)識(shí)從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時(shí)對(duì)此進(jìn)行標(biāo)記瓢对。序號(hào)字段的值則指的是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)寿酌。
(2)確認(rèn)號(hào):即ack序號(hào)(Acknowledgment number),占32位硕蛹,只有 ACK標(biāo)志位 為1時(shí)醇疼,確認(rèn)序號(hào)字段才有效硕并,ack=seq+1。是指期望收到對(duì)方的下一個(gè)報(bào)文段的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)秧荆。
-
(3)標(biāo)志位:共有6個(gè)標(biāo)志位倔毙,即URG、ACK乙濒、PSH陕赃、RST、SYN琉兜、FIN等凯正,具體含 義如下:
確認(rèn)ACK: 當(dāng)ACK = 1時(shí),確認(rèn)字段有效豌蟋,當(dāng)ACK = 0時(shí)廊散,確認(rèn)字段無(wú)效。TCP規(guī)定梧疲,在連接創(chuàng)建后所有傳送的報(bào)文段須將ACK置為1
同步SYN: 若SYN = 1允睹,則表示這是請(qǐng)求建立連接。
終止FIN: 釋放連接幌氮。當(dāng)FIN = 1時(shí)缭受,表示此報(bào)文段的發(fā)送方需要發(fā)送的數(shù)據(jù)已經(jīng)全部發(fā)送完畢,請(qǐng)求斷開(kāi)連接该互。
緊急URG: 當(dāng)URG = 1米者,表示緊急指針字段有效。此時(shí)發(fā)送方TCP就將緊急數(shù)據(jù)插入到本報(bào)文的數(shù)據(jù)的最前面宇智,后面順序不變蔓搞,保證將緊急需要發(fā)送的最先發(fā)送。與最后的緊急指針配合使用随橘。
推送PSH: 接受方TCP接收到PSH = 1喂分,表示該報(bào)文段高于優(yōu)先級(jí),需要盡快地交付給接受應(yīng)用程序机蔗,不需要等到整個(gè)TCP緩存都填滿(mǎn)了后在交付蒲祈。
復(fù)位 RST: 當(dāng)RST = 1時(shí),表示TCP連接發(fā)生嚴(yán)重錯(cuò)誤萝嘁,必須馬上釋放連接梆掸,重新建立新連接。?
? 需要注意的是:
? (A)不要將確認(rèn)序號(hào)ack與標(biāo)志位中的ACK搞混了牙言。
? (B)確認(rèn)方ack=發(fā)起方seq+1沥潭,兩端配對(duì)。
那這個(gè)序列號(hào)(seq)和確認(rèn)號(hào) (ack) 有什么作用呢嬉挡?
答:TCP中可以通過(guò)序列號(hào)與確認(rèn)應(yīng)答提高可靠性钝鸽。
好,有了這些基礎(chǔ)庞钢,下面我們就來(lái)講TCP的三次握手了~
5. TCP中的三次握手▲▲▲(面試點(diǎn))
5.1 描述一下TCP中三次握手的流程
所謂三次握手是指建立一個(gè) TCP 連接時(shí)需要客戶(hù)端和服務(wù)器端總共發(fā)送三個(gè)包以確認(rèn)連接的建立拔恰。
【詳細(xì)的描述】是這樣的:
第一次握手:建立連接』ǎ客戶(hù)端發(fā)送連接請(qǐng)求報(bào)文段颜懊,將SYN位置為1,seq(Sequence Number)為 J 风皿;然后河爹,客戶(hù)端進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器的確認(rèn)桐款。
第二次握手:服務(wù)器端收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道客戶(hù)端請(qǐng)求建立連接咸这,服務(wù)器端將標(biāo)志位SYN和ACK都置為1,ack=J+1魔眨,隨機(jī)產(chǎn)生一個(gè)值seq=K媳维,并將該數(shù)據(jù)包發(fā)送給客戶(hù)端以確認(rèn)連接請(qǐng)求,服務(wù)器端進(jìn)入SYN_RCVD狀態(tài)遏暴。
第三次握手:客戶(hù)端收到確認(rèn)后侄刽,檢查ack是否為J+1,ACK是否為1朋凉,如果正確則將標(biāo)志位ACK置為1州丹,ack=K+1,并將該數(shù)據(jù)包發(fā)送給服務(wù)器端杂彭,服務(wù)器端檢查ack是否為K+1墓毒,ACK是否為1,如果正確則連接建立成功盖灸,客戶(hù)端和服務(wù)器端進(jìn)入ESTABLISHED狀態(tài)蚁鳖,完成三次握手,隨后客戶(hù)端與服務(wù)器端之間可以開(kāi)始傳輸數(shù)據(jù)了赁炎。
【簡(jiǎn)單點(diǎn)描述】也就是:
第一次握手 → 客戶(hù)端請(qǐng)求建立連接醉箕。
第二次握手 → 服務(wù)端應(yīng)答客戶(hù)端,并請(qǐng)求建立連接徙垫。
第三次握手 → 客戶(hù)端針對(duì)服務(wù)端請(qǐng)求確認(rèn)應(yīng)答讥裤。
這樣就完成TCP三次握手 = 一條TCP連接建立完成 = 可以開(kāi)始發(fā)送數(shù)據(jù)
注意 1.三次握手期間任何一次未收到對(duì)面回復(fù)都要重發(fā)。
? 2.最后一個(gè)確認(rèn)報(bào)文段發(fā)送完畢以后姻报,客戶(hù)端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài)己英。
5.2 為什么TCP建立連接需要三次握手?
為了防止服務(wù)器端因?yàn)榻邮樟?strong>早已失效的連接請(qǐng)求報(bào)文從而一直等待客戶(hù)端請(qǐng)求吴旋,從而浪費(fèi)資源损肛。
再分析具體一點(diǎn)就是:
- “已失效的連接請(qǐng)求報(bào)文段”的產(chǎn)生在這樣一種情況下:Client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒(méi)有丟失厢破,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間的滯留了,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server治拿。
- 這是一個(gè)早已失效的報(bào)文段摩泪。但Server收到此失效的連接請(qǐng)求報(bào)文段后,就誤認(rèn)為是Client再次發(fā)出的一個(gè)新的連接請(qǐng)求劫谅。
- 于是就向Client發(fā)出確認(rèn)報(bào)文段见坑,同意建立連接。
- 假設(shè)不采用“三次握手”:只要Server發(fā)出確認(rèn)捏检,新的連接就建立了荞驴。
- 由于現(xiàn)在Client并沒(méi)有發(fā)出建立連接的請(qǐng)求,因此不會(huì)向Server發(fā)送數(shù)據(jù)贯城。
- 但Server卻以為新的運(yùn)輸連接已經(jīng)建立熊楼,并一直等待Client發(fā)來(lái)數(shù)據(jù)。>- 這樣冤狡,Server的資源就白白浪費(fèi)掉了孙蒙。
而采用了三次握手之后,上述問(wèn)題就不會(huì)發(fā)生悲雳。一切都會(huì)按照下面的正確腳步進(jìn)行:
- Client不會(huì)向Server的確認(rèn)發(fā)出確認(rèn)
- Server由于收不到確認(rèn)挎峦,就知道Client并沒(méi)有要求建立連接
- 所以Server不會(huì)等待Client發(fā)送數(shù)據(jù),資源就沒(méi)有被浪費(fèi)
5.3 TCP三次握手有什么漏洞嗎(知道即可)
漏洞:? SYN洪泛攻擊
? 定義:
通過(guò)網(wǎng)絡(luò)服務(wù)所在的端口發(fā)送大量偽造原地址的攻擊報(bào)文合瓢,發(fā)送到服務(wù)端坦胶,造成服務(wù)端上的半開(kāi)連接隊(duì)列被占滿(mǎn),從而阻止其他用戶(hù)進(jìn)行訪問(wèn)晴楔。
? 原理:
攻擊者客戶(hù)端利用偽造的IP地址向服務(wù)端發(fā)出請(qǐng)求(第一次握手)顿苇,而服務(wù)端的響應(yīng)(第二次握手)的報(bào)文將永遠(yuǎn)發(fā)送不到真實(shí)的客戶(hù)端,服務(wù)端在等待客戶(hù)端的第三次握手(永遠(yuǎn)都不會(huì)有的)税弃,服務(wù)端在等待這種半開(kāi)的連接過(guò)程中消耗了資源纪岁,如果有成千上萬(wàn)的這種連接,主機(jī)資源將被耗盡则果,從而達(dá)到攻擊的目的幔翰。
? 解決方案:
無(wú)效連接監(jiān)控釋放
延緩TCB分配方法
防火墻
6.TCP中的四次揮手(面試點(diǎn)▲)
6.1 描述一下TCP中四次揮手的流程
四次揮手即終止TCP連接,就是指斷開(kāi)一個(gè)TCP連接時(shí)西壮,需要客戶(hù)端和服務(wù)端總共發(fā)送4個(gè)包以確認(rèn)連接的斷開(kāi)遗增。
注意:可以是客戶(hù)端先發(fā)出中斷,也可以是服務(wù)器端先發(fā)出中斷款青。甚至是兩方同時(shí)發(fā)出中斷的情況也是有的做修!
【詳細(xì)的描述】是這樣的:
第一次揮手:客戶(hù)端發(fā)送一個(gè)FIN=M,用來(lái)關(guān)閉客戶(hù)端到服務(wù)器端的數(shù)據(jù)傳送,客戶(hù)端進(jìn)入FIN_WAIT_1狀態(tài)饰及。意思是說(shuō)"我客戶(hù)端沒(méi)有數(shù)據(jù)要發(fā)給你了"蔗坯,但是如果你服務(wù)器端還有數(shù)據(jù)沒(méi)有發(fā)送完成,則不必急著關(guān)閉連接燎含,可以繼續(xù)發(fā)送數(shù)據(jù)步悠。
第二次揮手:服務(wù)器端收到FIN后,先發(fā)送ack=M+1瘫镇,告訴客戶(hù)端,你的請(qǐng)求我收到了答姥,但是我還沒(méi)準(zhǔn)備好铣除,請(qǐng)繼續(xù)你等我的消息。這個(gè)時(shí)候客戶(hù)端就進(jìn)入FIN_WAIT_2 狀態(tài)鹦付,繼續(xù)等待服務(wù)器端的FIN報(bào)文尚粘。
第三次揮手:當(dāng)服務(wù)器端確定數(shù)據(jù)已發(fā)送完成,則向客戶(hù)端發(fā)送FIN=N報(bào)文敲长,告訴客戶(hù)端郎嫁,好了,我這邊數(shù)據(jù)發(fā)完了祈噪,準(zhǔn)備好關(guān)閉連接了泽铛。服務(wù)器端進(jìn)入LAST_ACK狀態(tài)。
第四次揮手:客戶(hù)端收到FIN=N報(bào)文后辑鲤,就知道可以關(guān)閉連接了盔腔,但是他還是不相信網(wǎng)絡(luò),怕服務(wù)器端不知道要關(guān)閉月褥,所以發(fā)送ack=N+1后進(jìn)入TIME_WAIT狀態(tài)弛随,如果Server端沒(méi)有收到ACK則可以重傳。服務(wù)器端收到ACK后宁赤,就知道可以斷開(kāi)連接了舀透。客戶(hù)端等待了2MSL后依然沒(méi)有收到回復(fù)决左,則證明服務(wù)器端已正常關(guān)閉愕够,那好,我客戶(hù)端也可以關(guān)閉連接了哆窿。最終完成了四次握手链烈。
【簡(jiǎn)單點(diǎn)描述】也就是:
第一次揮手:客戶(hù)端發(fā)送關(guān)閉請(qǐng)求
第二次揮手:服務(wù)端響應(yīng)客戶(hù)端關(guān)閉請(qǐng)求
第三次揮手:服務(wù)端發(fā)送關(guān)閉請(qǐng)求
第四次揮手:客戶(hù)端發(fā)送關(guān)閉確認(rèn)請(qǐng)求
6.2 為什么TCP釋放連接需要四次揮手?
為了保證雙方都能通知對(duì)方“需要釋放連接”挚躯,即在釋放連接后都無(wú)法接收或發(fā)送消息給對(duì)方
需要明確的是:TCP是全雙工模式强衡,這意味著是雙向都可以發(fā)送、接收的
釋放連接的定義是:雙方都無(wú)法接收或發(fā)送消息給對(duì)方码荔,是雙向的
-
當(dāng)主機(jī)1發(fā)出“釋放連接請(qǐng)求”(FIN報(bào)文段)時(shí)漩勤,只是表示主機(jī)1已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送 / 數(shù)據(jù)已經(jīng)全部發(fā)送完畢感挥;
但是,這個(gè)時(shí)候主機(jī)1還是可以接受來(lái)自主機(jī)2的數(shù)據(jù)越败。
當(dāng)主機(jī)2返回“確認(rèn)釋放連接”信息(ACK報(bào)文段)時(shí)触幼,表示它已經(jīng)知道主機(jī)1沒(méi)有數(shù)據(jù)發(fā)送了
但此時(shí)主機(jī)2還是可以發(fā)送數(shù)據(jù)給主機(jī)1當(dāng)主機(jī)2也發(fā)送了FIN報(bào)文段時(shí),即告訴主機(jī)1我也沒(méi)有數(shù)據(jù)要發(fā)送了
此時(shí)究飞,主機(jī)1和2已經(jīng)無(wú)法進(jìn)行通信:主機(jī)1無(wú)法發(fā)送數(shù)據(jù)給主機(jī)2置谦,主機(jī)2也無(wú)法發(fā)送數(shù)據(jù)給主機(jī)1,此時(shí)亿傅,TCP的連接才算釋放
6.3 為什么建立連接是三次握手媒峡,而關(guān)閉連接卻是四次揮手呢,為什么2葵擎、3兩次不能合并呢谅阿?
這是因?yàn)榉?wù)端在LISTEN狀態(tài)下,收到建立連接請(qǐng)求的SYN報(bào)文后酬滤,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶(hù)端签餐。而關(guān)閉連接時(shí),當(dāng)收到對(duì)方的FIN報(bào)文時(shí)盯串,僅僅表示對(duì)方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù)氯檐,己方也未必全部數(shù)據(jù)都發(fā)送給對(duì)方了,所以己方可以立即close嘴脾,也可以發(fā)送一些數(shù)據(jù)給對(duì)方后男摧,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示同意現(xiàn)在關(guān)閉連接,因此译打,己方ACK和FIN一般都會(huì)分開(kāi)發(fā)送耗拓。
7.TCP協(xié)議中的窗口機(jī)制(拓展,了解一下即可)
滑動(dòng)窗口
發(fā)送方和接收方都會(huì)維護(hù)一個(gè)數(shù)據(jù)幀的序列奏司,這個(gè)序列被稱(chēng)作窗口乔询。
發(fā)送方的窗口大小由接收方確認(rèn)。
目的:
1.確保數(shù)據(jù)不丟失
? 如果發(fā)送的數(shù)據(jù)丟失了可以重新發(fā)韵洋。
2.控制發(fā)送速度
? 控制發(fā)送速度竿刁,以免接收方的緩存不夠大導(dǎo)致溢出,同時(shí)控制流量也可以避免網(wǎng)絡(luò)擁塞搪缨。
嗯吶食拜,學(xué)習(xí)中,如有不正確的地方副编,希望可以一起討論呀~