[toc]
計(jì)算機(jī)網(wǎng)絡(luò)面試
基礎(chǔ)部分
TCP報(bào)頭格式 (20字節(jié))
[圖片上傳失敗...(image-5dc5cd-1521004095489)]
- 32位端口號(hào):
源端口和目的端口各占16位赡麦,2的16次方等于65536,看端口的命令:netstat爆阶。
- 32位序號(hào):
也稱為順序號(hào)(Sequence Number)萌庆,簡(jiǎn)寫為SEQ溶褪,
- 32位確認(rèn)序號(hào):
也稱為應(yīng)答號(hào)(Acknowledgment Number),簡(jiǎn)寫為ACK践险。在握手階段猿妈,確認(rèn)序號(hào)將發(fā)送方的序號(hào)加1作為回答。
- 4位首部長(zhǎng)度:
這個(gè)字段占4位巍虫,它的單位時(shí)32位(4個(gè)字節(jié))彭则。本例值為7,TCP的頭長(zhǎng)度為28字節(jié)垫言,等于正常的長(zhǎng)度2 0字節(jié)加上可選項(xiàng)8個(gè)字節(jié)贰剥。,TCP的頭長(zhǎng)度最長(zhǎng)可為60字節(jié)(二進(jìn)制1111換算為十進(jìn)制為15筷频,15*4字節(jié)=60字節(jié))。
- 6位標(biāo)志字段:
ACK 置1時(shí)表示確認(rèn)號(hào)(為合法前痘,為0的時(shí)候表示數(shù)據(jù)段不包含確認(rèn)信息凛捏,確認(rèn)號(hào)被忽略。
RST 置1時(shí)重建連接芹缔。如果接收到RST位時(shí)候坯癣,通常發(fā)生了某些錯(cuò)誤。
SYN 置1時(shí)用來發(fā)起一個(gè)連接最欠。
FIN 置1時(shí)表示發(fā)端完成發(fā)送任務(wù)示罗。用來釋放連接惩猫,表明發(fā)送方已經(jīng)沒有數(shù)據(jù)發(fā)送了。
URG 緊急指針蚜点,告訴接收TCP模塊緊要指針域指著緊要數(shù)據(jù)轧房。注:一般不使用。
PSH 置1時(shí)請(qǐng)求的數(shù)據(jù)段在接收方得到后就可直接送到應(yīng)用程序绍绘,而不必等到緩沖區(qū)滿時(shí)才傳送奶镶。注:一般不使用。
- 16位檢驗(yàn)和:
檢驗(yàn)和覆蓋了整個(gè)的TCP報(bào)文段: TCP首部和TCP數(shù)據(jù)陪拘。這是一個(gè)強(qiáng)制性的字段厂镇,一定是由發(fā)端計(jì)算和存儲(chǔ),并由收端進(jìn)行驗(yàn)證左刽。
- 16位緊急指針:
注:一般不使用捺信。
只有當(dāng)U R G標(biāo)志置1時(shí)緊急指針才有效。緊急指針是一個(gè)正的偏移量欠痴,和序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)残黑。
- 可選與變長(zhǎng)選項(xiàng):
通常為空,可根據(jù)首部長(zhǎng)度推算斋否。用于發(fā)送方與接收方協(xié)商最大報(bào)文段長(zhǎng)度(MSS)梨水,或在高速網(wǎng)絡(luò)環(huán)境下作窗口調(diào)節(jié)因子時(shí)使用。首部字段還定義了一個(gè)時(shí)間戳選項(xiàng)茵臭。
- 最常見的可選字段是最長(zhǎng)報(bào)文大小疫诽,又稱為MSS (Maximum Segment Size)同仆。每個(gè)連接方通常都在握手的第一步中指明這個(gè)選項(xiàng)嫩码。它指明本端所能接收的最大長(zhǎng)度的報(bào)文段胸懈。1460是以太網(wǎng)默認(rèn)的大小龄广。
UDP報(bào)頭格式(8字節(jié))
[圖片上傳失敗...(image-9ecf21-1521004095489)]
- 2字節(jié)源端口字段
源端口是一個(gè)大于1023的16位數(shù)字贬蛙,由基于UDP應(yīng)用程序的用戶進(jìn)程隨機(jī)選擇助隧。
2字節(jié)節(jié)的端口字段
2字節(jié)長(zhǎng)度字段
指明了包括首部在內(nèi)的UDP報(bào)文段長(zhǎng)度痒给。UDP長(zhǎng)字段的值是UDP報(bào)文頭的長(zhǎng)度(8字節(jié))與UDP所攜帶數(shù)據(jù)長(zhǎng)度的總和贪薪。
- 2字節(jié)校驗(yàn)和字段
是指整個(gè)UDP報(bào)文頭和UDP所帶的數(shù)據(jù)的校驗(yàn)和(也包括偽報(bào)文頭)查辩。偽報(bào)文頭不包括在真正的UDP報(bào)文頭中胖笛,但是它可以保證UDP數(shù)據(jù)被正確的主機(jī)收到了。因在校驗(yàn)和中加入了偽頭標(biāo)宜岛,故ICMP除能防止單純數(shù)據(jù)差錯(cuò)之外长踊,對(duì)IP分組也具有保護(hù)作用。
TCP/UDP區(qū)別 (待補(bǔ)全)
- TCP面向連接(如打電話要先撥號(hào)建立連接);UDP是無連接的萍倡,即發(fā)送數(shù)據(jù)之前不需要建立連接
- TCP提供可靠的服務(wù)身弊。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯(cuò)阱佛,不丟失帖汞,不重復(fù),且按序到達(dá);UDP盡最大努力交付凑术,即不保證可靠交付
Tcp通過校驗(yàn)和翩蘸,重傳控制,序號(hào)標(biāo)識(shí)麦萤,滑動(dòng)窗口鹿鳖、確認(rèn)應(yīng)答實(shí)現(xiàn)可靠傳輸。如丟包時(shí)的重發(fā)控制壮莹,還可以對(duì)次序亂掉的分包進(jìn)行順序控制翅帜。
UDP具有較好的實(shí)時(shí)性,工作效率比TCP高命满,適用于對(duì)高速傳輸和實(shí)時(shí)性有較高的通信或廣播通信涝滴。
每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多胶台,多對(duì)一和多對(duì)多的交互通信
TCP對(duì)系統(tǒng)資源要求較多歼疮,UDP對(duì)系統(tǒng)資源要求較少。
UDP相對(duì)于TCP的優(yōu)勢(shì)
UDP以其簡(jiǎn)單诈唬、傳輸快的優(yōu)勢(shì)韩脏,在越來越多場(chǎng)景下取代了TCP,如實(shí)時(shí)游戲。
網(wǎng)速的提升給UDP的穩(wěn)定性提供可靠網(wǎng)絡(luò)保障铸磅,丟包率很低赡矢,如果使用應(yīng)用層重傳,能夠確保傳輸?shù)目煽啃浴?/p>
TCP為了實(shí)現(xiàn)網(wǎng)絡(luò)通信的可靠性阅仔,使用了復(fù)雜的擁塞控制算法吹散,建立了繁瑣的握手過程,由于TCP內(nèi)置的系統(tǒng)協(xié)議棧中八酒,極難對(duì)其進(jìn)行改進(jìn)空民。
采用TCP,一旦發(fā)生丟包羞迷,TCP會(huì)將后續(xù)的包緩存起來界轩,等前面的包重傳并接收到后再繼續(xù)發(fā)送,延時(shí)會(huì)越來越大闭树,基于UDP對(duì)實(shí)時(shí)性要求較為嚴(yán)格的情況下耸棒,采用自定義重傳機(jī)制,能夠把丟包產(chǎn)生的延遲降到最低报辱,盡量減少網(wǎng)絡(luò)問題對(duì)游戲性造成影響。
TCP UDP 編程步驟的區(qū)別
TCP
服務(wù)端
- 創(chuàng)建一個(gè)socket
- 設(shè)置socket的屬性
- 綁定ip地址和端口
- 開啟監(jiān)聽
- 接受客戶端上來的連接
- 收發(fā)數(shù)據(jù)
- 關(guān)閉網(wǎng)絡(luò)連接
- 關(guān)閉監(jiān)聽
客戶端 - 創(chuàng)建一個(gè)socket
- 設(shè)置socket屬性
- 綁定IP地址、端口等信息到socket上
- 設(shè)置要連接的對(duì)方的IP地址和端口等屬性
- 連接服務(wù)器
- 收發(fā)數(shù)據(jù)
- 關(guān)閉網(wǎng)絡(luò)連接
UDP
服務(wù)端
- 創(chuàng)建一個(gè)socket碍现,用函數(shù)socket()幅疼;
- 設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
- 綁定IP地址昼接、端口等信息到socket上爽篷,用函數(shù)bind();
- 循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();
- 關(guān)閉網(wǎng)絡(luò)連接慢睡;
客戶端 - 創(chuàng)建一個(gè)socket逐工,用函數(shù)socket();
- 設(shè)置socket屬性漂辐,用函數(shù)setsockopt();* 可選
- 綁定IP地址泪喊、端口等信息到socket上,用函數(shù)bind();* 可選
- 設(shè)置對(duì)方的IP地址和端口等屬性;
- 發(fā)送數(shù)據(jù)髓涯,用函數(shù)sendto();
- 關(guān)閉網(wǎng)絡(luò)連接袒啼;
HTTP狀態(tài)碼
(最好結(jié)合使用場(chǎng)景,比如在緩存命中時(shí)使用哪個(gè))
- HTTP: Status 200 – 服務(wù)器成功返回網(wǎng)頁(yè)
- HTTP: Status 3xx - 表示要完成請(qǐng)求纬纪,需要進(jìn)一步操作 通常蚓再,這些狀態(tài)代碼用來重定向
- HTTP: Status 404 – 請(qǐng)求的網(wǎng)頁(yè)不存在
- HTTP: Status 503 – 服務(wù)不可用
HTTP協(xié)議
(一些報(bào)頭字段的作用,如cace-control包各、keep-alive)
OSI協(xié)議摘仅、TCP/IP協(xié)議以及每層對(duì)應(yīng)的協(xié)議。
SESSION機(jī)制问畅、cookie機(jī)制
TCP三次握手娃属、四次揮手
MSL是Maximum Segment Lifetime英文的縮寫,中文可以譯為“報(bào)文最大生存時(shí)間”按声,他是任何報(bào)文在網(wǎng)絡(luò)上存在的最長(zhǎng)時(shí)間膳犹,超過這個(gè)時(shí)間報(bào)文將被丟棄
打開網(wǎng)頁(yè)到頁(yè)面顯示之間的過程
- 嘗試從本機(jī)Host文件獲取ip地址,沒有則去請(qǐng)求DNS服務(wù)器獲取訪問的IP
- 通過三次握手建立TCP連接
- 通過HTTP協(xié)議請(qǐng)求網(wǎng)頁(yè)內(nèi)容
- 通過瀏覽器渲染請(qǐng)求過來的html
http和https區(qū)別
HTTP:是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議签则,是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)须床,用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它可以使瀏覽器更加高效渐裂,使網(wǎng)絡(luò)傳輸減少豺旬。
HTTPS:是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版柒凉,即HTTP下加入SSL層族阅,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL膝捞。
HTTPS和HTTP的區(qū)別主要如下:
- https協(xié)議需要到ca申請(qǐng)證書坦刀,一般免費(fèi)證書較少,因而需要一定費(fèi)用。
- http是超文本傳輸協(xié)議鲤遥,信息是明文傳輸沐寺,https則是具有安全性的ssl加密傳輸協(xié)議。
- http和https使用的是完全不同的連接方式盖奈,用的端口也不一樣混坞,前者是80,后者是443钢坦。
- http的連接很簡(jiǎn)單究孕,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸爹凹、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議厨诸,比http協(xié)議安全。
https在請(qǐng)求時(shí)額外的過程
客戶端在使用HTTPS方式與Web服務(wù)器通信時(shí)有以下幾個(gè)步驟逛万,如圖所示泳猬。
- 客戶使用https的URL訪問Web服務(wù)器,要求與Web服務(wù)器建立SSL連接宇植。
- Web服務(wù)器收到客戶端請(qǐng)求后得封,會(huì)將網(wǎng)站的證書信息(證書中包含公鑰)傳送一份給客戶端。
- 客戶端的瀏覽器與Web服務(wù)器開始協(xié)商SSL連接的安全等級(jí)指郁,也就是信息加密的等級(jí)忙上。
- 客戶端的瀏覽器根據(jù)雙方同意的安全等級(jí),建立會(huì)話密鑰闲坎,然后利用網(wǎng)站的公鑰將會(huì)話密鑰加密疫粥,并傳送給網(wǎng)站。
- Web服務(wù)器利用自己的私鑰解密出會(huì)話密鑰腰懂。
- Web服務(wù)器利用會(huì)話密鑰加密與客戶端之間的通信梗逮。
https是如何保證數(shù)據(jù)安全的
IP地址子網(wǎng)劃分
POST和GET區(qū)別
- GET后退按鈕/刷新無害,POST數(shù)據(jù)會(huì)被重新提交(瀏覽器應(yīng)該告知用戶數(shù)據(jù)會(huì)被重新提交)绣溜。
- GET書簽可收藏慷彤,POST為書簽不可收藏。
- GET能被緩存怖喻,POST不能緩存 底哗。
- GET編碼類型application/x-www-form-url,POST編碼類型encodedapplication/x-www-form-urlencoded 或 multipart/form-data锚沸。為二進(jìn)制數(shù)據(jù)使用多重編碼跋选。
- GET歷史參數(shù)保留在瀏覽器歷史中。POST參數(shù)不會(huì)保存在瀏覽器歷史中哗蜈。
- GET對(duì)數(shù)據(jù)長(zhǎng)度有限制前标,當(dāng)發(fā)送數(shù)據(jù)時(shí)坠韩,GET 方法向 URL 添加數(shù)據(jù);URL 的長(zhǎng)度是受限制的(URL 的最大長(zhǎng)度是 2048 個(gè)字符)候生。POST無限制同眯。
- GET只允許 ASCII 字符绽昼。POST沒有限制唯鸭。也允許二進(jìn)制數(shù)據(jù)。
- 與 POST 相比硅确,GET 的安全性較差目溉,因?yàn)樗l(fā)送的數(shù)據(jù)是 URL 的一部分。在發(fā)送密碼或其他敏感信息時(shí)絕不要使用 GET 菱农!POST 比 GET 更安全缭付,因?yàn)閰?shù)不會(huì)被保存在瀏覽器歷史或 web 服務(wù)器日志中。
- GET的數(shù)據(jù)在 URL 中對(duì)所有人都是可見的循未。POST的數(shù)據(jù)不會(huì)顯示在 URL 中陷猫。
出處
DNS解析過程
深入部分
TCP如何保證數(shù)據(jù)的可靠傳輸?shù)?/h3>
(這個(gè)問題可以引申出很多子問題,擁塞控制慢開始的妖、擁塞避免绣檬、快重傳、滑動(dòng)窗口協(xié)議嫂粟、停止等待協(xié)議娇未、超時(shí)重傳機(jī)制,最好都能掌握)