計算機(jī)網(wǎng)絡(luò)钮呀、計算機(jī)操作系統(tǒng)這兩個“兄弟”是所有開發(fā)崗位都需要“結(jié)拜”的,不管你是 Java昨凡、C++還是測試爽醋。對于后端開發(fā)的童鞋來說,計算機(jī)網(wǎng)絡(luò)的重要性不亞于語言基礎(chǔ)便脊,畢竟平時開發(fā)經(jīng)常會和網(wǎng)絡(luò)打交道子房,比如:抓個包等等。所以對這一塊知識點的準(zhǔn)備還是要抱著敬畏之心就轧,不要放過任何一個漏網(wǎng)之題。下面分享下我的學(xué)習(xí)過程:
1. 看書:對于計算機(jī)比較基礎(chǔ)的模塊田度,我都是比較推薦找一本經(jīng)典的書籍來好好學(xué)習(xí)下妒御,不可以只看面經(jīng)就去面試了。我一共看了兩本書:湯小丹的《計算機(jī)操作系統(tǒng)》和《圖解HTTP》镇饺『趵颍《計算機(jī)操作系統(tǒng)》是教科書,所以知識點相對比較基礎(chǔ)奸笤,覆蓋范圍也比較廣惋啃,非科班的學(xué)生還是很有必要看一看的〖嘤遥《圖解HTTP》這本書用很多插圖將一些知識點講的通俗易懂边灭,看起來也很快,還是比較推薦的健盒。
2. 做筆記:計算機(jī)網(wǎng)絡(luò)的知識點還是比較多的绒瘦,需要看書的時候做好筆記称簿,方便復(fù)習(xí)。而且做筆記的時候可以就這個知識點去百度下惰帽,看看有沒有自己遺漏的點憨降,再給補(bǔ)充進(jìn)來。在這里說下该酗,我為什么一直強(qiáng)調(diào)做筆記授药?好處 1:做筆記是第 1 次你對書中的知識點的回顧,加深記憶呜魄;好處 2:而且如果你是發(fā)表在公關(guān)社區(qū)的肯定要保證最大限度的正確性悔叽,就需要再去看看這個知識點,核對下自己是否有理解偏差和遺漏等耕赘,這樣就完成了知識點的深挖骄蝇;好處3:正在到面試復(fù)習(xí)的時候,你是不太可能重新看一本書的操骡,那么筆記就顯得很重要了九火,自己做的筆記,復(fù)習(xí)起來很快册招,而且最好在筆記里能有一些自己區(qū)別于面經(jīng)的理解岔激。
3. 看面經(jīng):經(jīng)常刷一刷牛客是掰,看看對于計算機(jī)網(wǎng)絡(luò)虑鼎,面試官們都是怎么問的?很多問題你可能會键痛,但是不懂面試官的問法炫彩,也會回答不上來;問到的題目自己是否準(zhǔn)備了絮短?而且對于計算機(jī)網(wǎng)絡(luò)和計算機(jī)操作系統(tǒng)會因為公司和崗位的不同而有所側(cè)重的江兢,多看看面經(jīng)就會發(fā)現(xiàn)還是有一點規(guī)律的,但是這都不是絕對的丁频,最后還要看面你的面試官的喜好杉允。
1、談下你對五層網(wǎng)絡(luò)協(xié)議體系結(jié)構(gòu)的理解席里?
學(xué)習(xí)計算機(jī)網(wǎng)絡(luò)時我們一般采用折中的辦法叔磷,也就是中和 OSI 和 TCP/IP 的優(yōu)點,采用一種只有五層協(xié)議的體系結(jié)構(gòu)奖磁,這樣既簡潔又能將概念闡述清楚改基。
1. 應(yīng)用層
應(yīng)用層(application-layer)的任務(wù)是通過應(yīng)用進(jìn)程間的交互來完成特定網(wǎng)絡(luò)應(yīng)用。應(yīng)用層協(xié)議定義的是應(yīng)用進(jìn)程(進(jìn)程:主機(jī)中正在運(yùn)行的程序)間的通信和交互的規(guī)則咖为。對于不同的網(wǎng)絡(luò)應(yīng)用需要不同的應(yīng)用層協(xié)議寥裂。在互聯(lián)網(wǎng)中應(yīng)用層協(xié)議很多嵌洼,如域名系統(tǒng) DNS,支持萬維網(wǎng)應(yīng)用的 HTTP 協(xié)議封恰,支持電子郵件的 SMTP 協(xié)議等等麻养。我們把應(yīng)用層交互的數(shù)據(jù)單元稱為報文。
2. 運(yùn)輸層
運(yùn)輸層(transport layer)的主要任務(wù)就是負(fù)責(zé)向兩臺主機(jī)進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù)诺舔。應(yīng)用進(jìn)程利用該服務(wù)傳送應(yīng)用層報文鳖昌。“通用的”是指并不針對某一個特定的網(wǎng)絡(luò)應(yīng)用低飒,而是多種應(yīng)用可以使用同一個運(yùn)輸層服務(wù)许昨。
由于一臺主機(jī)可同時運(yùn)行多個線程,因此運(yùn)輸層有復(fù)用和分用的功能褥赊。所謂復(fù)用就是指多個應(yīng)用層進(jìn)程可同時使用下面運(yùn)輸層的服務(wù)糕档,分用和復(fù)用相反,是運(yùn)輸層把收到的信息分別交付上面應(yīng)用層中的相應(yīng)進(jìn)程拌喉。
3. 網(wǎng)絡(luò)層
在計算機(jī)網(wǎng)絡(luò)中進(jìn)行通信的兩個計算機(jī)之間可能會經(jīng)過很多個數(shù)據(jù)鏈路速那,也可能還要經(jīng)過很多通信子網(wǎng)。網(wǎng)絡(luò)層的任務(wù)就是選擇合適的網(wǎng)間路由和交換結(jié)點尿背, 確保數(shù)據(jù)及時傳送端仰。在發(fā)送數(shù)據(jù)時,網(wǎng)絡(luò)層把運(yùn)輸層產(chǎn)生的報文段或用戶數(shù)據(jù)報封裝成分組和包進(jìn)行傳送田藐。在 TCP / IP 體系結(jié)構(gòu)中荔烧,由于網(wǎng)絡(luò)層使用 IP 協(xié)議,因此分組也叫 IP 數(shù)據(jù)報汽久,簡稱數(shù)據(jù)報鹤竭。
4. 數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層(data link layer)通常簡稱為鏈路層。兩臺主機(jī)之間的數(shù)據(jù)傳輸景醇,總是在一段一段的鏈路上傳送的臀稚,這就需要使用專門的鏈路層的協(xié)議。在兩個相鄰節(jié)點之間傳送數(shù)據(jù)時啡直,數(shù)據(jù)鏈路層將網(wǎng)絡(luò)層交下來的 IP 數(shù)據(jù)報組裝成幀,在兩個相鄰節(jié)點間的鏈路上傳送幀苍碟。每一幀包括數(shù)據(jù)和必要的控制信息(如:同步信息酒觅,地址信息,差錯控制等)微峰。
在接收數(shù)據(jù)時舷丹,控制信息使接收端能夠知道一個幀從哪個比特開始和到哪個比特結(jié)束。這樣蜓肆,數(shù)據(jù)鏈路層在收到一個幀后颜凯,就可從中提出數(shù)據(jù)部分谋币,上交給網(wǎng)絡(luò)層≈⒏牛控制信息還使接收端能夠檢測到所收到的幀中有無差錯蕾额。如果發(fā)現(xiàn)差錯,數(shù)據(jù)鏈路層就簡單地丟棄這個出了差錯的幀彼城,以避免繼續(xù)在網(wǎng)絡(luò)中傳送下去白白浪費(fèi)網(wǎng)絡(luò)資源诅蝶。如果需要改正數(shù)據(jù)在鏈路層傳輸時出現(xiàn)差錯(這就是說,數(shù)據(jù)鏈路層不僅要檢錯募壕,而且還要糾錯)调炬,那么就要采用可靠性傳輸協(xié)議來糾正出現(xiàn)的差錯。這種方法會使鏈路層的協(xié)議復(fù)雜些舱馅。
5. 物理層
在物理層上所傳送的數(shù)據(jù)單位是比特缰泡。物理層(physical layer)的作用是實現(xiàn)相鄰計算機(jī)節(jié)點之間比特流的透明傳送,盡可能屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異代嗤。使其上面的數(shù)據(jù)鏈路層不必考慮網(wǎng)絡(luò)的具體傳輸介質(zhì)是什么棘钞。“透明傳送比特流”表示經(jīng)實際電路傳送后的比特流沒有發(fā)生變化资溃,對傳送的比特流來說武翎,這個電路好像是看不見的。
2溶锭、簡單說下每一層對應(yīng)的網(wǎng)絡(luò)協(xié)議有哪些宝恶?
計算機(jī)五層網(wǎng)絡(luò)體系中涉及的協(xié)議非常多,下面就常用的做了列舉:
3趴捅、ARP 協(xié)議的工作原理垫毙?
網(wǎng)絡(luò)層的 ARP 協(xié)議完成了 IP 地址與物理地址的映射。首先拱绑,每臺主機(jī)都會在自己的 ARP 緩沖區(qū)中建立一個 ARP 列表综芥,以表示 IP 地址和 MAC 地址的對應(yīng)關(guān)系。當(dāng)源主機(jī)需要將一個數(shù)據(jù)包要發(fā)送到目的主機(jī)時猎拨,會首先檢查自己 ARP 列表中是否存在該 IP 地址對應(yīng)的 MAC 地址:如果有膀藐,就直接將數(shù)據(jù)包發(fā)送到這個 MAC 地址;如果沒有红省,就向本地網(wǎng)段發(fā)起一個 ARP 請求的廣播包额各,查詢此目的主機(jī)對應(yīng)的 MAC 地址。
此 ARP 請求數(shù)據(jù)包里包括源主機(jī)的 IP 地址吧恃、硬件地址虾啦、以及目的主機(jī)的 IP 地址。網(wǎng)絡(luò)中所有的主機(jī)收到這個 ARP 請求后,會檢查數(shù)據(jù)包中的目的 IP 是否和自己的 IP 地址一致傲醉。如果不相同就忽略此數(shù)據(jù)包蝇闭;如果相同,該主機(jī)首先將發(fā)送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中硬毕,如果 ARP 表中已經(jīng)存在該 IP 的信息呻引,則將其覆蓋,然后給源主機(jī)發(fā)送一個 ARP 響應(yīng)數(shù)據(jù)包昭殉,告訴對方自己是它需要查找的 MAC 地址苞七;源主機(jī)收到這個 ARP 響應(yīng)數(shù)據(jù)包后,將得到的目的主機(jī)的 IP 地址和 MAC 地址添加到自己的 ARP 列表中挪丢,并利用此信息開始數(shù)據(jù)的傳輸蹂风。如果源主機(jī)一直沒有收到 ARP 響應(yīng)數(shù)據(jù)包,表示 ARP 查詢失敗乾蓬。
4惠啄、談下你對 IP 地址分類的理解?
IP 地址是指互聯(lián)網(wǎng)協(xié)議地址任内,是 IP 協(xié)議提供的一種統(tǒng)一的地址格式撵渡,它為互聯(lián)網(wǎng)上的每一個網(wǎng)絡(luò)和每一臺主機(jī)分配一個邏輯地址,以此來屏蔽物理地址的差異死嗦。IP 地址編址方案將 IP 地址空間劃分為 A趋距、B、C越除、D节腐、E 五類,其中 A摘盆、B翼雀、C 是基本類,D孩擂、E 類作為多播和保留使用狼渊,為特殊地址。
每個 IP 地址包括兩個標(biāo)識碼(ID)类垦,即網(wǎng)絡(luò) ID 和主機(jī) ID狈邑。同一個物理網(wǎng)絡(luò)上的所有主機(jī)都使用同一個網(wǎng)絡(luò) ID,網(wǎng)絡(luò)上的一個主機(jī)(包括網(wǎng)絡(luò)上工作站蚤认,服務(wù)器和路由器等)有一個主機(jī) ID 與其對應(yīng)米苹。A~E 類地址的特點如下:
A 類地址:以 0 開頭,第一個字節(jié)范圍:0~127烙懦;
B 類地址:以 10 開頭驱入,第一個字節(jié)范圍:128~191;
C 類地址:以 110 開頭氯析,第一個字節(jié)范圍:192~223亏较;
D 類地址:以 1110 開頭,第一個字節(jié)范圍為 224~239掩缓;
E 類地址:以 1111 開頭雪情,保留地址
5、TCP 的主要特點是什么你辣?
1. TCP 是面向連接的巡通。(就好像打電話一樣,通話前需要先撥號建立連接舍哄,通話結(jié)束后要掛機(jī)釋放連接)宴凉;
2. 每一條 TCP 連接只能有兩個端點,每一條 TCP 連接只能是點對點的(一對一)表悬;
3. TCP 提供可靠交付的服務(wù)店印。通過 TCP 連接傳送的數(shù)據(jù)爸邢,無差錯、不丟失、不重復(fù)侍郭、并且按序到達(dá);
4. TCP 提供全雙工通信橄登。TCP 允許通信雙方的應(yīng)用進(jìn)程在任何時候都能發(fā)送數(shù)據(jù)轧膘。TCP 連接的兩端都設(shè)有發(fā)送緩存和接收緩存,用來臨時存放雙方通信的數(shù)據(jù)舟山;
5. 面向字節(jié)流绸狐。TCP 中的“流”(Stream)指的是流入進(jìn)程或從進(jìn)程流出的字節(jié)序列∧笏常“面向字節(jié)流”的含義是:雖然應(yīng)用程序和 TCP 的交互是一次一個數(shù)據(jù)塊(大小不等)六孵,但 TCP 把應(yīng)用程序交下來的數(shù)據(jù)僅僅看成是一連串的無結(jié)構(gòu)的字節(jié)流。
6幅骄、UDP 的主要特點是什么劫窒?
1. UDP 是無連接的;
2. UDP 使用盡最大努力交付拆座,即不保證可靠交付主巍,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)(這里面有許多參數(shù));
3. UDP 是面向報文的挪凑;
4. UDP 沒有擁塞控制孕索,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機(jī)的發(fā)送速率降低(對實時應(yīng)用很有用,如 直播躏碳,實時視頻會議等)搞旭;
5. UDP 支持一對一、一對多、多對一和多對多的交互通信肄渗;
6. UDP 的首部開銷小镇眷,只有 8 個字節(jié),比 TCP 的 20 個字節(jié)的首部要短翎嫡。
7欠动、TCP 和 UDP 的區(qū)別?
TCP 提供面向連接的服務(wù)惑申。在傳送數(shù)據(jù)之前必須先建立連接具伍,數(shù)據(jù)傳送結(jié)束后要釋放連接。TCP 不提供廣播或多播服務(wù)圈驼。由于 TCP 要提供可靠的人芽,面向連接的運(yùn)輸服務(wù)(TCP 的可靠體現(xiàn)在 TCP 在傳遞數(shù)據(jù)之前,會有三次握手來建立連接绩脆,而且在數(shù)據(jù)傳遞時啼肩,有確認(rèn)、窗口衙伶、重傳祈坠、擁塞控制機(jī)制,在數(shù)據(jù)傳完后矢劲,還會斷開連接用來節(jié)約系統(tǒng)資源)赦拘,這難以避免增加了許多開銷,如確認(rèn)芬沉,流量控制躺同,計時器以及連接管理等。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多丸逸,還要占用許多處理機(jī)資源蹋艺。
UDP 在傳送數(shù)據(jù)之前不需要先建立連接,遠(yuǎn)地主機(jī)在收到 UDP 報文后黄刚,不需要給出任何確認(rèn)捎谨。雖然 UDP 不提供可靠交付,但在某些情況下 UDP 確是一種最有效的工作方式(一般用于即時通信)憔维,比如:QQ 語音涛救、 QQ 視頻 、直播等等业扒。
8检吆、TCP 和 UDP 分別對應(yīng)的常見應(yīng)用層協(xié)議有哪些?
1. TCP 對應(yīng)的應(yīng)用層協(xié)議
FTP:定義了文件傳輸協(xié)議程储,使用 21 端口蹭沛。常說某某計算機(jī)開了 FTP 服務(wù)便是啟動了文件傳輸服務(wù)臂寝。下載文件,上傳主頁摊灭,都要用到 FTP 服務(wù)交煞。
Telnet:它是一種用于遠(yuǎn)程登陸的端口,用戶可以以自己的身份遠(yuǎn)程連接到計算機(jī)上斟或,通過這種端口可以提供一種基于 DOS 模式下的通信服務(wù)。如以前的 BBS 是-純字符界面的集嵌,支持 BBS 的服務(wù)器將 23 端口打開萝挤,對外提供服務(wù)。
SMTP:定義了簡單郵件傳送協(xié)議根欧,現(xiàn)在很多郵件服務(wù)器都用的是這個協(xié)議怜珍,用于發(fā)送郵件。如常見的免費(fèi)郵件服務(wù)中用的就是這個郵件服務(wù)端口凤粗,所以在電子郵件設(shè)置-中乘址海看到有這么 SMTP 端口設(shè)置這個欄,服務(wù)器開放的是 25 號端口嫌拣。
POP3:它是和 SMTP 對應(yīng)柔袁,POP3 用于接收郵件。通常情況下异逐,POP3 協(xié)議所用的是 110 端口捶索。也是說,只要你有相應(yīng)的使用 POP3 協(xié)議的程序(例如 Fo-xmail 或 Outlook)灰瞻,就可以不以 Web 方式登陸進(jìn)郵箱界面腥例,直接用郵件程序就可以收到郵件(如是163 郵箱就沒有必要先進(jìn)入網(wǎng)易網(wǎng)站,再進(jìn)入自己的郵-箱來收信)酝润。
HTTP:從 Web 服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議燎竖。
2. UDP 對應(yīng)的應(yīng)用層協(xié)議
DNS:用于域名解析服務(wù),將域名地址轉(zhuǎn)換為 IP 地址要销。DNS 用的是 53 號端口构回。
SNMP:簡單網(wǎng)絡(luò)管理協(xié)議,使用 161 號端口疏咐,是用來管理網(wǎng)絡(luò)設(shè)備的捐凭。由于網(wǎng)絡(luò)設(shè)備很多,無連接的服務(wù)就體現(xiàn)出其優(yōu)勢凳鬓。
TFTP(Trival File Transfer Protocal):簡單文件傳輸協(xié)議茁肠,該協(xié)議在熟知端口 69 上使用 UDP 服務(wù)。
9缩举、詳細(xì)說下 TCP 三次握手的過程垦梆?
1. 三次握手
TCP 建立連接的過程叫做握手匹颤,握手需要在客戶和服務(wù)器之間交換三個 TCP 報文段。
最初客戶端和服務(wù)端都處于 CLOSED(關(guān)閉) 狀態(tài)托猩。本例中 A(Client) 主動打開連接印蓖,B(Server) 被動打開連接。
一開始京腥,B 的 TCP 服務(wù)器進(jìn)程首先創(chuàng)建傳輸控制塊TCB赦肃,準(zhǔn)備接受客戶端進(jìn)程的連接請求。然后服務(wù)端進(jìn)程就處于 LISTEN(監(jiān)聽) 狀態(tài)公浪,等待客戶端的連接請求他宛。如有,立即作出響應(yīng)欠气。
第一次握手:A 的 TCP 客戶端進(jìn)程也是首先創(chuàng)建傳輸控制塊 TCB厅各。然后,在打算建立 TCP 連接時预柒,向 B 發(fā)出連接請求報文段队塘,這時首部中的同步位 SYN=1,同時選擇一個初始序號 seq = x宜鸯。TCP 規(guī)定憔古,SYN 報文段(即 SYN = 1 的報文段)不能攜帶數(shù)據(jù),但要消耗掉一個序號淋袖。這時投放,TCP 客戶進(jìn)程進(jìn)入 SYN-SENT(同步已發(fā)送)狀態(tài)。
第二次握手:B 收到連接請求報文后适贸,如果同意建立連接灸芳,則向 A 發(fā)送確認(rèn)。在確認(rèn)報文段中應(yīng)把 SYN 位和 ACK 位都置 1拜姿,確認(rèn)號是 ack = x + 1烙样,同時也為自己選擇一個初始序號 seq = y。請注意蕊肥,這個報文段也不能攜帶數(shù)據(jù)谒获,但同樣要消耗掉一個序號。這時 TCP 服務(wù)端進(jìn)程進(jìn)入 SYN-RCVD(同步收到)狀態(tài)壁却。
第三次握手:TCP 客戶進(jìn)程收到 B 的確認(rèn)后批狱,還要向 B 給出確認(rèn)。確認(rèn)報文段的 ACK 置 1展东,確認(rèn)號 ack = y + 1赔硫,而自己的序號 seq = x + 1。這時 ACK 報文段可以攜帶數(shù)據(jù)盐肃。但如果不攜帶數(shù)據(jù)則不消耗序號爪膊,這種情況下权悟,下一個數(shù)據(jù)報文段的序號仍是 seq = x + 1。這時推盛,TCP 連接已經(jīng)建立峦阁,A 進(jìn)入 ESTABLISHED(已建立連接)狀態(tài)。
10耘成、為什么兩次握手不可以呢榔昔?
為了防止已經(jīng)失效的連接請求報文段突然又傳送到了 B,因而產(chǎn)生錯誤瘪菌。比如下面這種情況:A 發(fā)出的第一個連接請求報文段并沒有丟失撒会,而是在網(wǎng)路結(jié)點長時間滯留了,以致于延誤到連接釋放以后的某個時間段才到達(dá) B控嗜。本來這是一個早已失效的報文段。但是 B 收到此失效的鏈接請求報文段后骡显,就誤認(rèn)為 A 又發(fā)出一次新的連接請求疆栏。于是就向 A 發(fā)出確認(rèn)報文段,同意建立連接惫谤。
對于上面這種情況壁顶,如果不進(jìn)行第三次握手,B 發(fā)出確認(rèn)后就認(rèn)為新的運(yùn)輸連接已經(jīng)建立了溜歪,并一直等待 A 發(fā)來數(shù)據(jù)若专。B 的許多資源就這樣白白浪費(fèi)了。
如果采用了三次握手蝴猪,由于 A 實際上并沒有發(fā)出建立連接請求调衰,所以不會理睬 B 的確認(rèn),也不會向 B 發(fā)送數(shù)據(jù)自阱。B 由于收不到確認(rèn)嚎莉,就知道 A 并沒有要求建立連接。
11沛豌、為什么不需要四次握手趋箩?
有人可能會說 A 發(fā)出第三次握手的信息后在沒有接收到 B 的請求就已經(jīng)進(jìn)入了連接狀態(tài),那如果 A 的這個確認(rèn)包丟失或者滯留了怎么辦加派?
我們需要明白一點叫确,完全可靠的通信協(xié)議是不存在的。在經(jīng)過三次握手之后芍锦,客戶端和服務(wù)端已經(jīng)可以確認(rèn)之前的通信狀況竹勉,都收到了確認(rèn)信息。所以即便再增加握手次數(shù)也不能保證后面的通信完全可靠娄琉,所以是沒有必要的饶米。
12桨啃、Server 端收到 Client 端的 SYN 后,為什么還要傳回 SYN檬输?
接收端傳回發(fā)送端所發(fā)送的 SYN 是為了告訴發(fā)送端照瘾,我接收到的信息確實就是你所發(fā)送的信號了。
SYN 是 TCP / IP 建立連接時使用的握手信號丧慈。在客戶機(jī)和服務(wù)器之間建立正常的 TCP 網(wǎng)絡(luò)連接時析命,客戶機(jī)首先發(fā)出一個 SYN 消息,服務(wù)器使用 SYN-ACK 應(yīng)答表示接收到了這個消息逃默,最后客戶機(jī)再以 ACK(Acknowledgement[漢譯:確認(rèn)字符鹃愤,在數(shù)據(jù)通信傳輸中,接收站發(fā)給發(fā)送站的一種傳輸控制字符完域。它表示確認(rèn)發(fā)來的數(shù)據(jù)已經(jīng)接受無誤])消息響應(yīng)软吐。這樣在客戶機(jī)和服務(wù)器之間才能建立起可靠的 TCP 連接,數(shù)據(jù)才可以在客戶機(jī)和服務(wù)器之間傳遞吟税。
13凹耙、傳了 SYN,為什么還要傳 ACK肠仪?
雙方通信無誤必須是兩者互相發(fā)送信息都無誤肖抱。傳了 SYN,證明發(fā)送方到接收方的通道沒有問題异旧,但是接收方到發(fā)送方的通道還需要 ACK 信號來進(jìn)行驗證意述。
14、詳細(xì)說下 TCP 四次揮手的過程吮蛹?
據(jù)傳輸結(jié)束后荤崇,通信的雙方都可以釋放連接。現(xiàn)在 A 和 B 都處于 ESTABLISHED 狀態(tài)潮针。
第一次揮手:A 的應(yīng)用進(jìn)程先向其 TCP 發(fā)出連接釋放報文段天试,并停止再發(fā)送數(shù)據(jù),主動關(guān)閉 TCP 連接然低。A 把連接釋放報文段首部的終止控制位 FIN 置 1喜每,其序號 seq = u(等于前面已傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加 1),這時 A 進(jìn)入 FIN-WAIT-1(終止等待1)狀態(tài)雳攘,等待 B 的確認(rèn)带兜。請注意:TCP 規(guī)定,F(xiàn)IN 報文段即使不攜帶數(shù)據(jù)吨灭,也將消耗掉一個序號刚照。
第二次揮手:B 收到連接釋放報文段后立即發(fā)出確認(rèn),確認(rèn)號是 ack = u + 1喧兄,而這個報文段自己的序號是 v(等于 B 前面已經(jīng)傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加1)无畔,然后 B 就進(jìn)入 CLOSE-WAIT(關(guān)閉等待)狀態(tài)啊楚。TCP 服務(wù)端進(jìn)程這時應(yīng)通知高層應(yīng)用進(jìn)程,因而從 A 到 B 這個方向的連接就釋放了浑彰,這時的 TCP 連接處于半關(guān)閉(half-close)狀態(tài)恭理,即 A 已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但 B 若發(fā)送數(shù)據(jù)郭变,A 仍要接收颜价。也就是說,從 B 到 A 這個方向的連接并未關(guān)閉诉濒,這個狀態(tài)可能會持續(xù)一段時間周伦。A 收到來自 B 的確認(rèn)后,就進(jìn)入 FIN-WAIT-2(終止等待2)狀態(tài)未荒,等待 B 發(fā)出的連接釋放報文段专挪。
第三次揮手:若 B 已經(jīng)沒有要向 A 發(fā)送的數(shù)據(jù),其應(yīng)用進(jìn)程就通知 TCP 釋放連接片排。這時 B 發(fā)出的連接釋放報文段必須使 FIN = 1寨腔。假定 B 的序號為 w(在半關(guān)閉狀態(tài),B 可能又發(fā)送了一些數(shù)據(jù))划纽。B 還必須重復(fù)上次已發(fā)送過的確認(rèn)號 ack = u + 1比驻。這時 B 就進(jìn)入 LAST-ACK(最后確認(rèn))狀態(tài)枷畏,等待 A 的確認(rèn)。
第四次揮手:A 在收到 B 的連接釋放報文后九默,必須對此發(fā)出確認(rèn)潭枣。在確認(rèn)報文段中把 ACK 置 1比默,確認(rèn)號 ack = w + 1,而自己的序號 seq = u + 1(前面發(fā)送的 FIN 報文段要消耗一個序號)盆犁。然后進(jìn)入 TIME-WAIT(時間等待) 狀態(tài)命咐。請注意,現(xiàn)在 TCP 連接還沒有釋放掉谐岁。必須經(jīng)過時間等待計時器設(shè)置的時間 2MSL(MSL:最長報文段壽命)后醋奠,A 才能進(jìn)入到 CLOSED 狀態(tài),然后撤銷傳輸控制塊伊佃,結(jié)束這次 TCP 連接窜司。當(dāng)然如果 B 一收到 A 的確認(rèn)就進(jìn)入 CLOSED 狀態(tài),然后撤銷傳輸控制塊航揉。所以在釋放連接時塞祈,B 結(jié)束 TCP 連接的時間要早于 A。
15帅涂、為什么 TIME-WAIT 狀態(tài)必須等待 2MSL 的時間呢议薪?
1. 為了保證 A 發(fā)送的最后一個 ACK 報文段能夠到達(dá) B尤蛮。這個 ACK 報文段有可能丟失,因而使處在 LAST-ACK 狀態(tài)的 B 收不到對已發(fā)送的 FIN + ACK 報文段的確認(rèn)斯议。B 會超時重傳這個 FIN+ACK 報文段产捞,而 A 就能在 2MSL 時間內(nèi)(超時 + 1MSL 傳輸)收到這個重傳的 FIN+ACK 報文段。接著 A 重傳一次確認(rèn)捅位,重新啟動 2MSL 計時器轧葛。最后,A 和 B 都正常進(jìn)入到 CLOSED 狀態(tài)艇搀。如果 A 在 TIME-WAIT 狀態(tài)不等待一段時間尿扯,而是在發(fā)送完 ACK 報文段后立即釋放連接,那么就無法收到 B 重傳的 FIN + ACK 報文段焰雕,因而也不會再發(fā)送一次確認(rèn)報文段衷笋,這樣,B 就無法按照正常步驟進(jìn)入 CLOSED 狀態(tài)矩屁。
2. 防止已失效的連接請求報文段出現(xiàn)在本連接中辟宗。A 在發(fā)送完最后一個 ACK 報文段后,再經(jīng)過時間 2MSL吝秕,就可以使本連接持續(xù)的時間內(nèi)所產(chǎn)生的所有報文段都從網(wǎng)絡(luò)中消失泊脐。這樣就可以使下一個連接中不會出現(xiàn)這種舊的連接請求報文段。
16烁峭、為什么第二次跟第三次不能合并, 第二次和第三次之間的等待是什么?
當(dāng)服務(wù)器執(zhí)行第二次揮手之后, 此時證明客戶端不會再向服務(wù)端請求任何數(shù)據(jù), 但是服務(wù)端可能還正在給客戶端發(fā)送數(shù)據(jù)(可能是客戶端上一次請求的資源還沒有發(fā)送完畢)容客,所以此時服務(wù)端會等待把之前未傳輸完的數(shù)據(jù)傳輸完畢之后再發(fā)送關(guān)閉請求。
17约郁、彼跆簦活計時器的作用?
除時間等待計時器外鬓梅,TCP 還有一個惫┲茫活計時器(keepalive timer)。設(shè)想這樣的場景:客戶已主動與服務(wù)器建立了 TCP 連接绽快。但后來客戶端的主機(jī)突然發(fā)生故障芥丧。顯然,服務(wù)器以后就不能再收到客戶端發(fā)來的數(shù)據(jù)坊罢。因此续担,應(yīng)當(dāng)有措施使服務(wù)器不要再白白等待下去。這就需要使用彼疑埽活計時器了赤拒。
服務(wù)器每收到一次客戶的數(shù)據(jù),就重新設(shè)置保活計時器挎挖,時間的設(shè)置通常是兩個小時这敬。若兩個小時都沒有收到客戶端的數(shù)據(jù),服務(wù)端就發(fā)送一個探測報文段蕉朵,以后則每隔 75 秒鐘發(fā)送一次崔涂。若連續(xù)發(fā)送 10個 探測報文段后仍然無客戶端的響應(yīng),服務(wù)端就認(rèn)為客戶端出了故障始衅,接著就關(guān)閉這個連接冷蚂。
18、TCP 協(xié)議是如何保證可靠傳輸?shù)模?/p>
1. 數(shù)據(jù)包校驗:目的是檢測數(shù)據(jù)在傳輸過程中的任何變化汛闸,若校驗出包有錯蝙茶,則丟棄報文段并且不給出響應(yīng),這時 TCP 發(fā)送數(shù)據(jù)端超時后會重發(fā)數(shù)據(jù)诸老;
2. 對失序數(shù)據(jù)包重排序:既然 TCP 報文段作為 IP 數(shù)據(jù)報來傳輸隆夯,而 IP 數(shù)據(jù)報的到達(dá)可能會失序,因此 TCP 報文段的到達(dá)也可能會失序别伏。TCP 將對失序數(shù)據(jù)進(jìn)行重新排序蹄衷,然后才交給應(yīng)用層;
3. 丟棄重復(fù)數(shù)據(jù):對于重復(fù)數(shù)據(jù)厘肮,能夠丟棄重復(fù)數(shù)據(jù)愧口;
4. 應(yīng)答機(jī)制:當(dāng) TCP 收到發(fā)自 TCP 連接另一端的數(shù)據(jù),它將發(fā)送一個確認(rèn)类茂。這個確認(rèn)不是立即發(fā)送耍属,通常將推遲幾分之一秒;
5. 超時重發(fā):當(dāng) TCP 發(fā)出一個段后大咱,它啟動一個定時器恬涧,等待目的端確認(rèn)收到這個報文段注益。如果不能及時收到一個確認(rèn)碴巾,將重發(fā)這個報文段;
6. 流量控制:TCP 連接的每一方都有固定大小的緩沖空間丑搔。TCP 的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)厦瓢,這可以防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出,這就是流量控制啤月。TCP 使用的流量控制協(xié)議是可變大小的滑動窗口協(xié)議煮仇。
19、談?wù)勀銓νV沟却齾f(xié)議的理解谎仲?
停止等待協(xié)議是為了實現(xiàn)可靠傳輸?shù)恼愕妫幕驹砭褪敲堪l(fā)完一個分組就停止發(fā)送,等待對方確認(rèn)。在收到確認(rèn)后再發(fā)下一個分組夹姥;在停止等待協(xié)議中杉武,若接收方收到重復(fù)分組,就丟棄該分組辙售,但同時還要發(fā)送確認(rèn)轻抱。主要包括以下幾種情況:無差錯情況、出現(xiàn)差錯情況(超時重傳)旦部、確認(rèn)丟失和確認(rèn)遲到祈搜、確認(rèn)丟失和確認(rèn)遲到。
20士八、談?wù)勀銓?ARQ 協(xié)議的理解容燕?
自動重傳請求 ARQ 協(xié)議
停止等待協(xié)議中超時重傳是指只要超過一段時間仍然沒有收到確認(rèn),就重傳前面發(fā)送過的分組(認(rèn)為剛才發(fā)送過的分組丟失了)婚度。因此每發(fā)送完一個分組需要設(shè)置一個超時計時器缰趋,其重傳時間應(yīng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r間更長一些。這種自動重傳方式常稱為自動重傳請求 ARQ陕见。
連續(xù) ARQ 協(xié)議
連續(xù) ARQ 協(xié)議可提高信道利用率秘血。發(fā)送方維持一個發(fā)送窗口,凡位于發(fā)送窗口內(nèi)的分組可以連續(xù)發(fā)送出去评甜,而不需要等待對方確認(rèn)灰粮。接收方一般采用累計確認(rèn),對按序到達(dá)的最后一個分組發(fā)送確認(rèn)忍坷,表明到這個分組為止的所有分組都已經(jīng)正確收到了粘舟。
21、談?wù)勀銓瑒哟翱诘牧私猓?/p>
TCP 利用滑動窗口實現(xiàn)流量控制的機(jī)制佩研「屉龋滑動窗口(Sliding window)是一種流量控制技術(shù)。早期的網(wǎng)絡(luò)通信中旬薯,通信雙方不會考慮網(wǎng)絡(luò)的擁擠情況直接發(fā)送數(shù)據(jù)晰骑。由于大家不知道網(wǎng)絡(luò)擁塞狀況,同時發(fā)送數(shù)據(jù)绊序,導(dǎo)致中間節(jié)點阻塞掉包硕舆,誰也發(fā)不了數(shù)據(jù),所以就有了滑動窗口機(jī)制來解決此問題骤公。
TCP 中采用滑動窗口來進(jìn)行傳輸控制抚官,滑動窗口的大小意味著接收方還有多大的緩沖區(qū)可以用于接收數(shù)據(jù)。發(fā)送方可以通過滑動窗口的大小來確定應(yīng)該發(fā)送多少字節(jié)的數(shù)據(jù)阶捆。當(dāng)滑動窗口為 0 時凌节,發(fā)送方一般不能再發(fā)送數(shù)據(jù)報钦听,但有兩種情況除外,一種情況是可以發(fā)送緊急數(shù)據(jù)倍奢,例如彪见,允許用戶終止在遠(yuǎn)端機(jī)上的運(yùn)行進(jìn)程。另一種情況是發(fā)送方可以發(fā)送一個 1 字節(jié)的數(shù)據(jù)報來通知接收方重新聲明它希望接收的下一字節(jié)及發(fā)送方的滑動窗口大小娱挨。
22余指、談下你對流量控制的理解?
TCP 利用滑動窗口實現(xiàn)流量控制跷坝。流量控制是為了控制發(fā)送方發(fā)送速率酵镜,保證接收方來得及接收。接收方發(fā)送的確認(rèn)報文中的窗口字段可以用來控制發(fā)送方窗口大小柴钻,從而影響發(fā)送方的發(fā)送速率淮韭。將窗口字段設(shè)置為 0,則發(fā)送方不能發(fā)送數(shù)據(jù)贴届。
23靠粪、談下你對 TCP 擁塞控制的理解?使用了哪些算法毫蚓?
擁塞控制和流量控制不同占键,前者是一個全局性的過程,而后者指點對點通信量的控制元潘。在某段時間畔乙,若對網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡(luò)的性能就要變壞翩概。這種情況就叫擁塞牲距。
擁塞控制就是為了防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣就可以使網(wǎng)絡(luò)中的路由器或鏈路不致于過載钥庇。擁塞控制所要做的都有一個前提牍鞠,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。擁塞控制是一個全局性的過程评姨,涉及到所有的主機(jī)难述,所有的路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素参咙。相反龄广,流量控制往往是點對點通信量的控制硫眯,是個端到端的問題蕴侧。流量控制所要做到的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來得及接收两入。
為了進(jìn)行擁塞控制净宵,TCP 發(fā)送方要維持一個擁塞窗口(cwnd) 的狀態(tài)變量。擁塞控制窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動態(tài)變化择葡。發(fā)送方讓自己的發(fā)送窗口取為擁塞窗口和接收方的接受窗口中較小的一個紧武。
TCP 的擁塞控制采用了四種算法,即:慢開始敏储、擁塞避免阻星、快重傳和快恢復(fù)。在網(wǎng)絡(luò)層也可以使路由器采用適當(dāng)?shù)姆纸M丟棄策略(如:主動隊列管理 AQM)已添,以減少網(wǎng)絡(luò)擁塞的發(fā)生妥箕。
慢開始:
慢開始算法的思路是當(dāng)主機(jī)開始發(fā)送數(shù)據(jù)時,如果立即把大量數(shù)據(jù)字節(jié)注入到網(wǎng)絡(luò)更舞,那么可能會引起網(wǎng)絡(luò)阻塞畦幢,因為現(xiàn)在還不知道網(wǎng)絡(luò)的符合情況。經(jīng)驗表明缆蝉,較好的方法是先探測一下宇葱,即由小到大逐漸增大發(fā)送窗口,也就是由小到大逐漸增大擁塞窗口數(shù)值刊头。cwnd 初始值為 1黍瞧,每經(jīng)過一個傳播輪次,cwnd 加倍原杂。
擁塞避免:
擁塞避免算法的思路是讓擁塞窗口 cwnd 緩慢增大雷逆,即每經(jīng)過一個往返時間 RTT 就把發(fā)送方的 cwnd 加 1。
快重傳與快恢復(fù):
在 TCP/IP 中污尉,快速重傳和快恢復(fù)(fast retransmit and recovery膀哲,F(xiàn)RR)是一種擁塞控制算法,它能快速恢復(fù)丟失的數(shù)據(jù)包被碗。
沒有 FRR某宪,如果數(shù)據(jù)包丟失了,TCP 將會使用定時器來要求傳輸暫停锐朴。在暫停的這段時間內(nèi)兴喂,沒有新的或復(fù)制的數(shù)據(jù)包被發(fā)送。有了 FRR焚志,如果接收機(jī)接收到一個不按順序的數(shù)據(jù)段衣迷,它會立即給發(fā)送機(jī)發(fā)送一個重復(fù)確認(rèn)。如果發(fā)送機(jī)接收到三個重復(fù)確認(rèn)酱酬,它會假定確認(rèn)件指出的數(shù)據(jù)段丟失了壶谒,并立即重傳這些丟失的數(shù)據(jù)段。
有了 FRR膳沽,就不會因為重傳時要求的暫停被耽誤汗菜。當(dāng)有單獨(dú)的數(shù)據(jù)包丟失時让禀,快速重傳和快恢復(fù)(FRR)能最有效地工作。當(dāng)有多個數(shù)據(jù)信息包在某一段很短的時間內(nèi)丟失時陨界,它則不能很有效地工作巡揍。
24、什么是粘包菌瘪?
在進(jìn)行 Java NIO 學(xué)習(xí)時腮敌,可能會發(fā)現(xiàn):如果客戶端連續(xù)不斷的向服務(wù)端發(fā)送數(shù)據(jù)包時,服務(wù)端接收的數(shù)據(jù)會出現(xiàn)兩個數(shù)據(jù)包粘在一起的情況俏扩。
1. TCP 是基于字節(jié)流的缀皱,雖然應(yīng)用層和 TCP 傳輸層之間的數(shù)據(jù)交互是大小不等的數(shù)據(jù)塊,但是 TCP 把這些數(shù)據(jù)塊僅僅看成一連串無結(jié)構(gòu)的字節(jié)流动猬,沒有邊界啤斗;
2. 從 TCP 的幀結(jié)構(gòu)也可以看出,在 TCP 的首部沒有表示數(shù)據(jù)長度的字段赁咙。
基于上面兩點钮莲,在使用 TCP 傳輸數(shù)據(jù)時,才有粘包或者拆包現(xiàn)象發(fā)生的可能彼水。一個數(shù)據(jù)包中包含了發(fā)送端發(fā)送的兩個數(shù)據(jù)包的信息崔拥,這種現(xiàn)象即為粘包。
接收端收到了兩個數(shù)據(jù)包凤覆,但是這兩個數(shù)據(jù)包要么是不完整的链瓦,要么就是多出來一塊,這種情況即發(fā)生了拆包和粘包盯桦。拆包和粘包的問題導(dǎo)致接收端在處理的時候會非常困難慈俯,因為無法區(qū)分一個完整的數(shù)據(jù)包。
25拥峦、TCP 黏包是怎么產(chǎn)生的贴膘?
發(fā)送方產(chǎn)生粘包
采用 TCP 協(xié)議傳輸數(shù)據(jù)的客戶端與服務(wù)器經(jīng)常是保持一個長連接的狀態(tài)(一次連接發(fā)一次數(shù)據(jù)不存在粘包),雙方在連接不斷開的情況下略号,可以一直傳輸數(shù)據(jù)刑峡。但當(dāng)發(fā)送的數(shù)據(jù)包過于的小時,那么 TCP 協(xié)議默認(rèn)的會啟用 Nagle 算法玄柠,將這些較小的數(shù)據(jù)包進(jìn)行合并發(fā)送(緩沖區(qū)數(shù)據(jù)發(fā)送是一個堆壓的過程)突梦;這個合并過程就是在發(fā)送緩沖區(qū)中進(jìn)行的,也就是說數(shù)據(jù)發(fā)送出來它已經(jīng)是粘包的狀態(tài)了羽利。
接收方產(chǎn)生粘包
接收方采用 TCP 協(xié)議接收數(shù)據(jù)時的過程是這樣的:數(shù)據(jù)到接收方宫患,從網(wǎng)絡(luò)模型的下方傳遞至傳輸層,傳輸層的 TCP 協(xié)議處理是將其放置接收緩沖區(qū)铐伴,然后由應(yīng)用層來主動獲却樽唷(C 語言用 recv俏讹、read 等函數(shù))当宴;這時會出現(xiàn)一個問題畜吊,就是我們在程序中調(diào)用的讀取數(shù)據(jù)函數(shù)不能及時的把緩沖區(qū)中的數(shù)據(jù)拿出來奏瞬,而下一個數(shù)據(jù)又到來并有一部分放入的緩沖區(qū)末尾刨啸,等我們讀取數(shù)據(jù)時就是一個粘包。(放數(shù)據(jù)的速度 > 應(yīng)用層拿數(shù)據(jù)速度)
26才漆、怎么解決拆包和粘包梯浪?
分包機(jī)制一般有兩個通用的解決方法:
1. 特殊字符控制捌年;
2. 在包頭首都添加數(shù)據(jù)包的長度。
如果使用 netty 的話挂洛,就有專門的編碼器和解碼器解決拆包和粘包問題了礼预。
tips:UDP 沒有粘包問題,但是有丟包和亂序虏劲。不完整的包是不會有的托酸,收到的都是完全正確的包。傳送的數(shù)據(jù)單位協(xié)議是 UDP 報文或用戶數(shù)據(jù)報柒巫,發(fā)送的時候既不合并励堡,也不拆分。
27堡掏、你對 HTTP 狀態(tài)碼有了解嗎应结?
1XX 信息
1. 100 Continue :表明到目前為止都很正常,客戶端可以繼續(xù)發(fā)送請求或者忽略這個響應(yīng)泉唁。
2XX 成功
1. 200 OK
2. 204 No Content :請求已經(jīng)成功處理鹅龄,但是返回的響應(yīng)報文不包含實體的主體部分。一般在只需要從客戶端往服務(wù)器發(fā)送信息亭畜,而不需要返回數(shù)據(jù)時使用砾层。
3. 206 Partial Content :表示客戶端進(jìn)行了范圍請求,響應(yīng)報文包含由 Content-Range 指定范圍的實體內(nèi)容贱案。
3XX 重定向
1. 301 Moved Permanently :永久性重定向肛炮;
2. 302 Found :臨時性重定向;
3. 303 See Other :和 302 有著相同的功能宝踪,但是 303 明確要求客戶端應(yīng)該采用 GET 方法獲取資源侨糟。
4. 304 Not Modified :如果請求報文首部包含一些條件,例如:If-Match瘩燥,If-Modified-Since秕重,If-None-Match,If-Range厉膀,If-Unmodified-Since溶耘,如果不滿足條件二拐,則服務(wù)器會返回 304 狀態(tài)碼。
5. 307 Temporary Redirect :臨時重定向凳兵,與 302 的含義類似百新,但是 307 要求瀏覽器不會把重定向請求的 POST 方法改成 GET 方法。
4XX 客戶端錯誤
1. 400 Bad Request :請求報文中存在語法錯誤庐扫。
2. 401 Unauthorized :該狀態(tài)碼表示發(fā)送的請求需要有認(rèn)證信息(BASIC 認(rèn)證饭望、DIGEST 認(rèn)證)。如果之前已進(jìn)行過一次請求形庭,則表示用戶認(rèn)證失敗铅辞。
3. 403 Forbidden :請求被拒絕。
4. 404 Not Found
5XX 服務(wù)器錯誤
1. 500 Internal Server Error :服務(wù)器正在執(zhí)行請求時發(fā)生錯誤萨醒;
2. 503 Service Unavailable :服務(wù)器暫時處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù)斟珊,現(xiàn)在無法處理請求。
28富纸、HTTP 狀態(tài)碼 301 和 302 代表的是什么囤踩?有什么區(qū)別?
301胜嗓,302 都是 HTTP 狀態(tài)的編碼高职,都代表著某個 URL 發(fā)生了轉(zhuǎn)移。
區(qū)別:
301 redirect: 301 代表永久性轉(zhuǎn)移(Permanently Moved)
302 redirect: 302 代表暫時性轉(zhuǎn)移(Temporarily Moved)
29辞州、forward 和 redirect 的區(qū)別怔锌?
Forward 和 Redirect 代表了兩種請求轉(zhuǎn)發(fā)方式:直接轉(zhuǎn)發(fā)和間接轉(zhuǎn)發(fā)。
直接轉(zhuǎn)發(fā)方式(Forward):客戶端和瀏覽器只發(fā)出一次請求变过,Servlet埃元、HTML、JSP 或其它信息資源媚狰,由第二個信息資源響應(yīng)該請求岛杀,在請求對象 request 中,保存的對象對于每個信息資源是共享的崭孤。
間接轉(zhuǎn)發(fā)方式(Redirect):實際是兩次 HTTP 請求类嗤,服務(wù)器端在響應(yīng)第一次請求的時候,讓瀏覽器再向另外一個 URL 發(fā)出請求辨宠,從而達(dá)到轉(zhuǎn)發(fā)的目的遗锣。
舉個通俗的例子:
直接轉(zhuǎn)發(fā)就相當(dāng)于:“A 找 B 借錢,B 說沒有嗤形,B 去找 C 借精偿,借到借不到都會把消息傳遞給 A”;
間接轉(zhuǎn)發(fā)就相當(dāng)于:"A 找 B 借錢,B 說沒有笔咽,讓 A 去找 C 借"搔预。
30、HTTP 方法有哪些叶组?
客戶端發(fā)送的 請求報文 第一行為請求行拯田,包含了方法字段。
1. GET:獲取資源扶叉,當(dāng)前網(wǎng)絡(luò)中絕大部分使用的都是 GET勿锅;
2. HEAD:獲取報文首部帕膜,和 GET 方法類似枣氧,但是不返回報文實體主體部分;
3. POST:傳輸實體主體
4. PUT:上傳文件垮刹,由于自身不帶驗證機(jī)制达吞,任何人都可以上傳文件,因此存在安全性問題荒典,一般不使用該方法酪劫。
5. PATCH:對資源進(jìn)行部分修改。PUT 也可以用于修改資源寺董,但是只能完全替代原始資源覆糟,PATCH 允許部分修改。
6. OPTIONS:查詢指定的 URL 支持的方法遮咖;
7. CONNECT:要求在與代理服務(wù)器通信時建立隧道滩字。使用 SSL(Secure Sockets Layer,安全套接層)和 TLS(Transport Layer Security御吞,傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸麦箍。
8. TRACE:追蹤路徑。服務(wù)器會將通信路徑返回給客戶端陶珠。發(fā)送請求時挟裂,在 Max-Forwards 首部字段中填入數(shù)值,每經(jīng)過一個服務(wù)器就會減 1揍诽,當(dāng)數(shù)值為 0 時就停止傳輸诀蓉。通常不會使用 TRACE,并且它容易受到 XST 攻擊(Cross-Site Tracing暑脆,跨站追蹤)渠啤。
31、說下 GET 和 POST 的區(qū)別饵筑?
GET 和 POST 本質(zhì)都是 HTTP 請求埃篓,只不過對它們的作用做了界定和適配,并且讓他們適應(yīng)各自的場景根资。
本質(zhì)區(qū)別:GET 只是一次 HTTP請求架专,POST 先發(fā)請求頭再發(fā)請求體同窘,實際上是兩次請求。
1. 從功能上講部脚,GET 一般用來從服務(wù)器上獲取資源想邦,POST 一般用來更新服務(wù)器上的資源;
2. 從 REST 服務(wù)角度上說委刘,GET 是冪等的丧没,即讀取同一個資源,總是得到相同的數(shù)據(jù)锡移,而 POST 不是冪等的呕童,因為每次請求對資源的改變并不是相同的;進(jìn)一步地淆珊,GET 不會改變服務(wù)器上的資源夺饲,而 POST 會對服務(wù)器資源進(jìn)行改變;
3. 從請求參數(shù)形式上看施符,GET 請求的數(shù)據(jù)會附在 URL 之后往声,即將請求數(shù)據(jù)放置在 HTTP 報文的 請求頭 中,以 ? 分割 URL 和傳輸數(shù)據(jù)戳吝,參數(shù)之間以 & 相連浩销。特別地,如果數(shù)據(jù)是英文字母/數(shù)字听哭,原樣發(fā)送慢洋;否則,會將其編碼為 application/x-www-form-urlencoded MIME 字符串(如果是空格欢唾,轉(zhuǎn)換為+且警,如果是中文/其他字符,則直接把字符串用 BASE64 加密礁遣,得出如:%E4%BD%A0%E5%A5%BD斑芜,其中 %XX 中的 XX 為該符號以 16 進(jìn)制表示的 ASCII);而 POST 請求會把提交的數(shù)據(jù)則放置在是 HTTP 請求報文的 請求體 中祟霍;
4. 就安全性而言杏头,POST 的安全性要比 GET 的安全性高,因為 GET 請求提交的數(shù)據(jù)將明文出現(xiàn)在 URL 上沸呐,而且 POST 請求參數(shù)則被包裝到請求體中醇王,相對更安全;
5. 從請求的大小看崭添,GET 請求的長度受限于瀏覽器或服務(wù)器對 URL 長度的限制寓娩,允許發(fā)送的數(shù)據(jù)量比較小,而 POST 請求則是沒有大小限制的。
32棘伴、在瀏覽器中輸入 URL 地址到顯示主頁的過程寞埠?
1. DNS 解析:瀏覽器查詢 DNS,獲取域名對應(yīng)的 IP 地址:具體過程包括瀏覽器搜索自身的 DNS 緩存焊夸、搜索操作系統(tǒng)的 DNS 緩存仁连、讀取本地的 Host 文件和向本地 DNS 服務(wù)器進(jìn)行查詢等。對于向本地 DNS 服務(wù)器進(jìn)行查詢阱穗,如果要查詢的域名包含在本地配置區(qū)域資源中饭冬,則返回解析結(jié)果給客戶機(jī),完成域名解析(此解析具有權(quán)威性)揪阶;如果要查詢的域名不由本地 DNS 服務(wù)器區(qū)域解析昌抠,但該服務(wù)器已緩存了此網(wǎng)址映射關(guān)系,則調(diào)用這個 IP 地址映射遣钳,完成域名解析(此解析不具有權(quán)威性)扰魂。如果本地域名服務(wù)器并未緩存該網(wǎng)址映射關(guān)系麦乞,那么將根據(jù)其設(shè)置發(fā)起遞歸查詢或者迭代查詢蕴茴;
2. TCP 連接:瀏覽器獲得域名對應(yīng)的 IP 地址以后,瀏覽器向服務(wù)器請求建立鏈接姐直,發(fā)起三次握手倦淀;
3. 發(fā)送 HTTP 請求:TCP 連接建立起來后,瀏覽器向服務(wù)器發(fā)送 HTTP 請求声畏;
4. 服務(wù)器處理請求并返回 HTTP 報文:服務(wù)器接收到這個請求撞叽,并根據(jù)路徑參數(shù)映射到特定的請求處理器進(jìn)行處理,并將處理結(jié)果及相應(yīng)的視圖返回給瀏覽器插龄;
5. 瀏覽器解析渲染頁面:瀏覽器解析并渲染視圖愿棋,若遇到對 js 文件、css 文件及圖片等靜態(tài)資源的引用均牢,則重復(fù)上述步驟并向服務(wù)器請求這些資源糠雨;瀏覽器根據(jù)其請求到的資源、數(shù)據(jù)渲染頁面徘跪,最終向用戶呈現(xiàn)一個完整的頁面甘邀。
6. 連接結(jié)束。
33垮庐、DNS 的解析過程松邪?
1. 主機(jī)向本地域名服務(wù)器的查詢一般都是采用遞歸查詢。所謂遞歸查詢就是:如果主機(jī)所詢問的本地域名服務(wù)器不知道被查詢的域名的 IP 地址哨查,那么本地域名服務(wù)器就以 DNS 客戶的身份逗抑,向根域名服務(wù)器繼續(xù)發(fā)出查詢請求報文(即替主機(jī)繼續(xù)查詢),而不是讓主機(jī)自己進(jìn)行下一步查詢。因此邮府,遞歸查詢返回的查詢結(jié)果或者是所要查詢的 IP 地址浙于,或者是報錯,表示無法查詢到所需的 IP 地址挟纱。
2. 本地域名服務(wù)器向根域名服務(wù)器的查詢的迭代查詢羞酗。迭代查詢的特點:當(dāng)根域名服務(wù)器收到本地域名服務(wù)器發(fā)出的迭代查詢請求報文時,要么給出所要查詢的 IP 地址紊服,要么告訴本地服務(wù)器:“你下一步應(yīng)當(dāng)向哪一個域名服務(wù)器進(jìn)行查詢”檀轨。然后讓本地服務(wù)器進(jìn)行后續(xù)的查詢。根域名服務(wù)器通常是把自己知道的頂級域名服務(wù)器的 IP 地址告訴本地域名服務(wù)器欺嗤,讓本地域名服務(wù)器再向頂級域名服務(wù)器查詢参萄。頂級域名服務(wù)器在收到本地域名服務(wù)器的查詢請求后,要么給出所要查詢的 IP 地址煎饼,要么告訴本地服務(wù)器下一步應(yīng)當(dāng)向哪一個權(quán)限域名服務(wù)器進(jìn)行查詢讹挎。最后,本地域名服務(wù)器得到了所要解析的 IP 地址或報錯吆玖,然后把這個結(jié)果返回給發(fā)起查詢的主機(jī)筒溃。
34、談?wù)勀銓τ蛎彺娴牧私猓?/p>
為了提高 DNS 查詢效率沾乘,并減輕服務(wù)器的負(fù)荷和減少因特網(wǎng)上的 DNS 查詢報文數(shù)量怜奖,在域名服務(wù)器中廣泛使用了高速緩存,用來存放最近查詢過的域名以及從何處獲得域名映射信息的記錄翅阵。
由于名字到地址的綁定并不經(jīng)常改變歪玲,為保持高速緩存中的內(nèi)容正確,域名服務(wù)器應(yīng)為每項內(nèi)容設(shè)置計時器并處理超過合理時間的項(例如:每個項目兩天)掷匠。當(dāng)域名服務(wù)器已從緩存中刪去某項信息后又被請求查詢該項信息滥崩,就必須重新到授權(quán)管理該項的域名服務(wù)器綁定信息。當(dāng)權(quán)限服務(wù)器回答一個查詢請求時讹语,在響應(yīng)中都指明綁定有效存在的時間值钙皮。增加此時間值可減少網(wǎng)絡(luò)開銷,而減少此時間值可提高域名解析的正確性募强。
不僅在本地域名服務(wù)器中需要高速緩存株灸,在主機(jī)中也需要。許多主機(jī)在啟動時從本地服務(wù)器下載名字和地址的全部數(shù)據(jù)庫擎值,維護(hù)存放自己最近使用的域名的高速緩存慌烧,并且只在從緩存中找不到名字時才使用域名服務(wù)器。維護(hù)本地域名服務(wù)器數(shù)據(jù)庫的主機(jī)應(yīng)當(dāng)定期地檢查域名服務(wù)器以獲取新的映射信息鸠儿,而且主機(jī)必須從緩存中刪除無效的項屹蚊。由于域名改動并不頻繁厕氨,大多數(shù)網(wǎng)點不需花精力就能維護(hù)數(shù)據(jù)庫的一致性。
35汹粤、談下你對 HTTP 長連接和短連接的理解命斧?分別應(yīng)用于哪些場景?
在 HTTP/1.0 中默認(rèn)使用短連接嘱兼。也就是說国葬,客戶端和服務(wù)器每進(jìn)行一次 HTTP 操作,就建立一次連接芹壕,任務(wù)結(jié)束就中斷連接汇四。當(dāng)客戶端瀏覽器訪問的某個 HTML 或其他類型的 Web 頁中包含有其他的 Web 資源(如:JavaScript 文件、圖像文件踢涌、CSS 文件等)通孽,每遇到這樣一個 Web 資源,瀏覽器就會重新建立一個 HTTP 會話睁壁。
而從 HTTP/1.1 起背苦,默認(rèn)使用長連接,用以保持連接特性潘明。使用長連接的 HTTP 協(xié)議行剂,會在響應(yīng)頭加入這行代碼
Connection:keep-alive
在使用長連接的情況下,當(dāng)一個網(wǎng)頁打開完成后钉疫,客戶端和服務(wù)器之間用于傳輸 HTTP 數(shù)據(jù)的 TCP 連接不會關(guān)閉硼讽,客戶端再次訪問這個服務(wù)器時,會繼續(xù)使用這一條已經(jīng)建立的連接牲阁。
Keep-Alive 不會永久保持連接,它有一個保持時間壤躲,可以在不同的服務(wù)器軟件(如:Apache)中設(shè)定這個時間城菊。實現(xiàn)長連接需要客戶端和服務(wù)端都支持長連接。
36碉克、談下 HTTP 1.0 和 1.1凌唬、1.2 的主要變化?
HTTP1.1 的主要變化:
1. HTTP1.0 經(jīng)過多年發(fā)展漏麦,在 1.1 提出了改進(jìn)客税。首先是提出了長連接,HTTP 可以在一次 TCP 連接中不斷發(fā)送請求撕贞。
2. 然后 HTTP1.1 支持只發(fā)送 header 而不發(fā)送 body更耻。原因是先用 header 判斷能否成功,再發(fā)數(shù)據(jù)捏膨,節(jié)約帶寬秧均,事實上食侮,post 請求默認(rèn)就是這樣做的。
3. HTTP1.1 的 host 字段目胡。由于虛擬主機(jī)可以支持多個域名锯七,所以一般將域名解析后得到 host。
HTTP2.0 的主要變化:
1. HTTP2.0 支持多路復(fù)用誉己,同一個連接可以并發(fā)處理多個請求眉尸,方法是把 HTTP數(shù)據(jù)包拆為多個幀,并發(fā)有序的發(fā)送巨双,根據(jù)序號在另一端進(jìn)行重組效五,而不需要一個個 HTTP請求順序到達(dá);
2. HTTP2.0 支持服務(wù)端推送炉峰,就是服務(wù)端在 HTTP 請求到達(dá)后畏妖,除了返回數(shù)據(jù)之外拥知,還推送了額外的內(nèi)容給客戶端赚瘦;
3. HTTP2.0 壓縮了請求頭泪幌,同時基本單位是二進(jìn)制幀流水援,這樣的數(shù)據(jù)占用空間更少异吻;
4. HTTP2.0 適用于 HTTPS 場景极颓,因為其在 HTTP和 TCP 中間加了一層 SSL 層衅谷。
37慕爬、HTTPS 的工作過程淘邻?
1. 客戶端發(fā)送自己支持的加密規(guī)則給服務(wù)器茵典,代表告訴服務(wù)器要進(jìn)行連接了;
2. 服務(wù)器從中選出一套加密算法和 hash 算法以及自己的身份信息(地址等)以證書的形式發(fā)送給瀏覽器宾舅,證書中包含服務(wù)器信息统阿,加密公鑰,證書的辦法機(jī)構(gòu)筹我;
3. 客戶端收到網(wǎng)站的證書之后要做下面的事情:
3.1 驗證證書的合法性扶平;
3.2 果驗證通過證書,瀏覽器會生成一串隨機(jī)數(shù)蔬蕊,并用證書中的公鑰進(jìn)行加密结澄;
3.3 用約定好的 hash 算法計算握手消息,然后用生成的密鑰進(jìn)行加密岸夯,然后一起發(fā)送給服務(wù)器麻献。
4. 服務(wù)器接收到客戶端傳送來的信息,要做下面的事情:
4.1 用私鑰解析出密碼猜扮,用密碼解析握手消息勉吻,驗證 hash 值是否和瀏覽器發(fā)來的一致;
4.2 使用密鑰加密消息破镰;
5. 如果計算法 hash 值一致餐曼,握手成功压储。
38、HTTP 和 HTTPS 的區(qū)別源譬?
1. 開銷:HTTPS 協(xié)議需要到 CA 申請證書集惋,一般免費(fèi)證書很少,需要交費(fèi)踩娘;
2. 資源消耗:HTTP 是超文本傳輸協(xié)議刮刑,信息是明文傳輸,HTTPS 則是具有安全性的 ssl 加密傳輸協(xié)議养渴,需要消耗更多的 CPU 和內(nèi)存資源雷绢;
3. 端口不同:HTTP 和 HTTPS 使用的是完全不同的連接方式,用的端口也不一樣理卑,前者是 80翘紊,后者是 443;
4. 安全性:HTTP 的連接很簡單藐唠,是無狀態(tài)的帆疟;HTTPS 協(xié)議是由 TSL+HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議宇立,比 HTTP 協(xié)議安全踪宠。
39、HTTPS 的優(yōu)缺點妈嘹?
優(yōu)點:
1. 使用 HTTPS 協(xié)議可認(rèn)證用戶和服務(wù)器柳琢,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器;
2. HTTPS 協(xié)議是由 SSL + HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸润脸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議柬脸,要比 HTTP 協(xié)議安全,可防止數(shù)據(jù)在傳輸過程中不被竊取津函、改變肖粮,確保數(shù)據(jù)的完整性;
3. HTTPS 是現(xiàn)行架構(gòu)下最安全的解決方案尔苦,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本行施。
缺點:
1. HTTPS 協(xié)議握手階段比較費(fèi)時允坚,會使頁面的加載時間延長近 50%,增加 10% 到 20% 的耗電蛾号;
2. HTTPS 連接緩存不如 HTTP 高效稠项,會增加數(shù)據(jù)開銷和功耗,甚至已有的安全措施也會因此而受到影響鲜结;
3. SSL 證書需要錢展运,功能越強(qiáng)大的證書費(fèi)用越高活逆,個人網(wǎng)站、小網(wǎng)站沒有必要一般不會用拗胜;
4. SSL 證書通常需要綁定 IP蔗候,不能在同一 IP 上綁定多個域名,IPv4 資源不可能支撐這個消耗埂软;
5. HTTPS 協(xié)議的加密范圍也比較有限锈遥,在黑客攻擊、拒絕服務(wù)攻擊勘畔、服務(wù)器劫持等方面幾乎起不到什么作用所灸。最關(guān)鍵的,SSL 證書的信用鏈體系并不安全炫七,特別是在某些國家可以控制 CA 根證書的情況下爬立,中間人攻擊一樣可行。
40万哪、什么是數(shù)字簽名侠驯?
為了避免數(shù)據(jù)在傳輸過程中被替換,比如黑客修改了你的報文內(nèi)容壤圃,但是你并不知道陵霉,所以我們讓發(fā)送端做一個數(shù)字簽名,把數(shù)據(jù)的摘要消息進(jìn)行一個加密伍绳,比如 MD5踊挠,得到一個簽名,和數(shù)據(jù)一起發(fā)送冲杀。然后接收端把數(shù)據(jù)摘要進(jìn)行 MD5 加密效床,如果和簽名一樣,則說明數(shù)據(jù)確實是真的权谁。
41剩檀、什么是數(shù)字證書?
對稱加密中旺芽,雙方使用公鑰進(jìn)行解密沪猴。雖然數(shù)字簽名可以保證數(shù)據(jù)不被替換,但是數(shù)據(jù)是由公鑰加密的采章,如果公鑰也被替換运嗜,則仍然可以偽造數(shù)據(jù),因為用戶不知道對方提供的公鑰其實是假的悯舟。所以為了保證發(fā)送方的公鑰是真的担租,CA 證書機(jī)構(gòu)會負(fù)責(zé)頒發(fā)一個證書,里面的公鑰保證是真的抵怎,用戶請求服務(wù)器時奋救,服務(wù)器將證書發(fā)給用戶岭参,這個證書是經(jīng)由系統(tǒng)內(nèi)置證書的備案的。
42尝艘、什么是對稱加密和非對稱加密演侯?
對稱密鑰加密是指加密和解密使用同一個密鑰的方式,這種方式存在的最大問題就是密鑰發(fā)送問題利耍,即如何安全地將密鑰發(fā)給對方蚌本。
非對稱加密指使用一對非對稱密鑰,即:公鑰和私鑰隘梨,公鑰可以隨意發(fā)布程癌,但私鑰只有自己知道。發(fā)送密文的一方使用對方的公鑰進(jìn)行加密處理轴猎,對方接收到加密信息后嵌莉,使用自己的私鑰進(jìn)行解密。
由于非對稱加密的方式不需要發(fā)送用來解密的私鑰捻脖,所以可以保證安全性锐峭。但是和對稱加密比起來,它非常的慢可婶,所以我們還是要用對稱加密來傳送消息沿癞,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發(fā)送出去。