面試專題我放在git上了,地址Github 歡迎fork然后一起更新
1皇筛,基礎(chǔ)知識(shí)
- ip地址和端口號(hào):ip地址是唯一的通訊實(shí)體泉孩,一個(gè)端口號(hào)對(duì)應(yīng)一個(gè)通訊實(shí)體
- tcp/udp協(xié)議:udp是無連接協(xié)議漫拭,可以通過任何途徑達(dá)到目的地避消,不可靠,但是效率高顽冶,可以用來做做視頻聊天
tcp需要三次握手欺抗,是可靠的協(xié)議,傳輸效率低强重,
- URL:統(tǒng)一的資源定位器绞呈,
- InetAddress,java提供的一個(gè)地址類
- http連接的特點(diǎn):客戶端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng)间景,在請(qǐng)求結(jié)束后佃声,會(huì)主動(dòng)釋放連接。從建立連接到關(guān)閉連接的過程稱為一次連接倘要。
- 網(wǎng)絡(luò)分層:OSI七層模型(應(yīng)用層圾亏,表示層十拣,會(huì)話層,傳輸層志鹃,網(wǎng)絡(luò)層夭问,數(shù)據(jù)鏈路層,物理層)
2曹铃,Socket
創(chuàng)建socket實(shí)例缰趋,大部分基于
客戶端連接:
1,創(chuàng)建socket對(duì)象
2陕见,連接建立后秘血,通過輸出流向服務(wù)器端發(fā)送請(qǐng)求信息
3,通過輸入流獲取服務(wù)器響應(yīng)的信息
4评甜,關(guān)閉響應(yīng)資源
服務(wù)端連接:
1直撤,創(chuàng)建ServerSocket對(duì)象,綁定監(jiān)聽端口
2蜕着,通過accept()方法監(jiān)聽客戶端請(qǐng)求
3,連接建立后红柱,通過輸入流讀取客戶端發(fā)送的請(qǐng)求信息
4承匣,通過輸入流向客戶端發(fā)送信息
5,關(guān)閉相關(guān)資源
3锤悄,Socket建立網(wǎng)絡(luò)連接的步驟:
建立Socket連接至少需要一對(duì)套接字韧骗,其中一個(gè)運(yùn)行與客戶端--ClientSocket,一個(gè)運(yùn)行于服務(wù)端--ServiceSocket
1零聚、服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字袍暴,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)隶症,等待客戶端的連接請(qǐng)求政模。
2、客戶端請(qǐng)求:指客戶端的套接字提出連接請(qǐng)求蚂会,要連接的目標(biāo)是服務(wù)器端的套接字淋样。注意:客戶端的套接字必須描述他要連接的服務(wù)器的套接字,
指出服務(wù)器套接字的地址和端口號(hào)胁住,然后就像服務(wù)器端套接字提出連接請(qǐng)求趁猴。
3、連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到客戶端套接字的連接請(qǐng)求時(shí)彪见,就響應(yīng)客戶端套接字的請(qǐng)求儡司,建立一個(gè)新的線程,把服務(wù)器端套接字的描述
發(fā)給客戶端余指,一旦客戶端確認(rèn)了此描述捕犬,雙方就正式建立連接。而服務(wù)端套接字則繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求或听。
4探孝,Socket和http的區(qū)別
Http協(xié)議:簡單的對(duì)象訪問協(xié)議,對(duì)應(yīng)于應(yīng)用層誉裆。Http協(xié)議是基于TCP鏈接的顿颅。
tcp協(xié)議:對(duì)應(yīng)于傳輸層
ip協(xié)議:對(duì)應(yīng)與網(wǎng)絡(luò)層
TCP/IP是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸足丢;而Http是應(yīng)用層協(xié)議粱腻,主要解決如何包裝數(shù)據(jù)。
Socket是對(duì)TCP/IP協(xié)議的封裝斩跌,Socket本身并不是協(xié)議绍些,而是一個(gè)調(diào)用接口(API),通過Socket耀鸦,我們才能使用TCP/IP協(xié)議柬批。
Http連接:http連接就是所謂的短連接,及客戶端向服務(wù)器發(fā)送一次請(qǐng)求袖订,服務(wù)器端相應(yīng)后連接即會(huì)斷掉氮帐。
socket連接:socket連接及時(shí)所謂的長連接,理論上客戶端和服務(wù)端一旦建立連接洛姑,則不會(huì)主動(dòng)斷掉上沐;但是由于各種環(huán)境因素可能會(huì)是連接斷開,比如說:服務(wù)器端或客戶端主機(jī)down了楞艾,網(wǎng)絡(luò)故障参咙,或者兩者之間長時(shí)間沒有數(shù)據(jù)傳輸,網(wǎng)絡(luò)防火墻可能會(huì)斷開該鏈接已釋放網(wǎng)絡(luò)資源硫眯。所以當(dāng)一個(gè)socket連接中沒有數(shù)據(jù)的傳輸蕴侧,那么為了位置連續(xù)的連接需要發(fā)送心跳消息,具體心跳消息格式是開發(fā)者自己定義的两入。
5戈盈,java的IO接口
基于字節(jié),字符谆刨,磁盤塘娶,網(wǎng)絡(luò)操作的IO接口
(BIO)阻塞式IO的通訊模型,如下圖()
BIO數(shù)據(jù)在寫入OutputStream
6痊夭, TCP 與 UDP 的區(qū)別
- TCP面向連接(如打電話要先撥號(hào)建立連接);UDP是無連接的刁岸,即發(fā)送數(shù)據(jù)之前不需要建立連接
- TCP提供可靠的服務(wù)。也就是說她我,通過TCP連接傳送的數(shù)據(jù)虹曙,無差錯(cuò)迫横,不丟失,不重復(fù)酝碳,且按序到達(dá);UDP盡最大努力交付矾踱,即不保證可靠交付
- TCP面向字節(jié)流,實(shí)際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報(bào)文的 UDP沒有擁塞控制疏哗,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使源主機(jī)的發(fā)送速率降低(對(duì)實(shí)時(shí)應(yīng)用很有用呛讲,如IP電話,實(shí)時(shí)視頻會(huì)議等)
- 每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一返奉,一對(duì)多贝搁,多對(duì)一和多對(duì)多的交互通信
- TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個(gè)字節(jié)
- TCP的邏輯通信信道是全雙工的可靠信道芽偏,UDP則是不可靠信道
7雷逆,TCP 的 3 次握手和四次揮手
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài)污尉,等待服務(wù)器確認(rèn)膀哲;
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1)被碗,同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k)某宪,即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)蛮放;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)奠宜,此包發(fā)送完畢包颁,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手压真。
握手過程中傳送的包里不包含數(shù)據(jù)娩嚼,三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)滴肿。理想狀態(tài)下岳悟,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前泼差,TCP 連接都將被一直保持下去贵少。斷開連接時(shí)服務(wù)器和客戶端均可以主動(dòng)發(fā)起斷開TCP連接的請(qǐng)求,斷開過程需要經(jīng)過“四次揮手”
第一次揮手:客戶端發(fā)送報(bào)文告訴服務(wù)器沒有數(shù)據(jù)要發(fā)送了
第二次揮手:服務(wù)端收到堆缘,再發(fā)送給客戶端告訴它我收到了
第三次揮手:服務(wù)端向客戶端發(fā)送報(bào)文滔灶,請(qǐng)求關(guān)閉連接
第四次揮手:客戶端收到關(guān)閉連接的請(qǐng)求,向服務(wù)端發(fā)送報(bào)文吼肥,服務(wù)端關(guān)閉連接
8录平,TCP為什么三次握手不是兩次握手麻车,為什么兩次握手不安全
為了實(shí)現(xiàn)可靠數(shù)據(jù)傳輸, TCP 協(xié)議的通信雙方斗这, 都必須維護(hù)一個(gè)序列號(hào)动猬, 以標(biāo)識(shí)發(fā)送出去的數(shù)據(jù)包中, 哪些是已經(jīng)被對(duì)方收到的表箭。 三次握手的過程即是通信雙方相互告知序列號(hào)起始值赁咙, 并確認(rèn)對(duì)方已經(jīng)收到了序列號(hào)起始值的必經(jīng)步驟
如果只是兩次握手, 至多只有連接發(fā)起方的起始序列號(hào)能被確認(rèn)燃逻, 另一方選擇的序列號(hào)則得不到確認(rèn)
9序目,為什么TCP是可靠的,UDP早不可靠的?為什么UDP比TCP快?
TCP/IP協(xié)議擁有三次握手雙向機(jī)制伯襟,這一機(jī)制保證校驗(yàn)了數(shù)據(jù)猿涨,保證了他的可靠性。
UDP就沒有了姆怪,udp信息發(fā)出后,不驗(yàn)證是否到達(dá)對(duì)方,所以不可靠叛赚。
10,Http的get和post的區(qū)別
http是應(yīng)用層的協(xié)議稽揭,底層基于TCP/IP協(xié)議俺附,所以本質(zhì)上,get和post請(qǐng)求都是TCP請(qǐng)求溪掀。所以二者的區(qū)別都是體現(xiàn)在應(yīng)用層上(HTTP的規(guī)定和瀏覽器/服務(wù)器的限制)
1.參數(shù)的傳輸方式:GET參數(shù)通過URL傳遞事镣,POST放在Request body中。
2.GET請(qǐng)求在URL中傳送的參數(shù)是有長度限制的揪胃,而POST沒有璃哟。
3.對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去喊递,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù))随闪;而對(duì)于POST,瀏覽器先發(fā)送header骚勘,服務(wù)器響應(yīng)100 continue铐伴,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))俏讹。不過要注意当宴,并不是所有瀏覽器都會(huì)在POST中發(fā)送兩次包,比如火狐
4.對(duì)參數(shù)的數(shù)據(jù)類型泽疆,GET只接受ASCII字符即供,而POST沒有限制。
5.GET比POST更不安全于微,因?yàn)閰?shù)直接暴露在URL上逗嫡,所以不能用來傳遞敏感信息青自。
6.GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式驱证。
7.GET在瀏覽器回退時(shí)是無害的延窜,而POST會(huì)再次提交請(qǐng)求。
8.GET產(chǎn)生的URL地址可以被Bookmark抹锄,而POST不可以逆瑞。
9.GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì)伙单,除非手動(dòng)設(shè)置获高。
11,socket和http的區(qū)別
Http協(xié)議:簡單的對(duì)象訪問協(xié)議吻育,對(duì)應(yīng)于應(yīng)用層念秧。Http協(xié)議是基于TCP鏈接的。
tcp協(xié)議:對(duì)應(yīng)于傳輸層
ip協(xié)議:對(duì)應(yīng)與網(wǎng)絡(luò)層
TCP/IP是傳輸層協(xié)議布疼,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸摊趾;而Http是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)游两。
Socket是對(duì)TCP/IP協(xié)議的封裝砾层,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API)贱案,通過Socket肛炮,我們才能使用TCP/IP協(xié)議。
Http連接:http連接就是所謂的短連接宝踪,及客戶端向服務(wù)器發(fā)送一次請(qǐng)求侨糟,服務(wù)器端相應(yīng)后連接即會(huì)斷掉。
socket連接:socket連接及時(shí)所謂的長連接肴沫,理論上客戶端和服務(wù)端一旦建立連接粟害,則不會(huì)主動(dòng)斷掉蕴忆;但是由于各種環(huán)境因素可能會(huì)是連接斷開颤芬,比如說:服務(wù)器端或客戶端主機(jī)down了,網(wǎng)絡(luò)故障套鹅,或者兩者之間長時(shí)間沒有數(shù)據(jù)傳輸站蝠,網(wǎng)絡(luò)防火墻可能會(huì)斷開該鏈接已釋放網(wǎng)絡(luò)資源。所以當(dāng)一個(gè)socket連接中沒有數(shù)據(jù)的傳輸卓鹿,那么為了位置連續(xù)的連接需要發(fā)送心跳消息菱魔,具體心跳消息格式是開發(fā)者自己定義的。
12吟孙,描述一次網(wǎng)絡(luò)請(qǐng)求的流程
1)域名解析
瀏覽器會(huì)先搜索自身DNS緩存且對(duì)應(yīng)的IP地址沒有過期澜倦;若未找到則搜索操作系統(tǒng)自身的DNS緩存聚蝶;若還未找到則讀本地的hotsts文件;還未找到會(huì)在TCP/IP設(shè)置的本地DNS服務(wù)器上找藻治,如果要查詢的域名在本地配置的區(qū)域資源中碘勉,則完成解析;否則根據(jù)本地DNS服務(wù)器會(huì)請(qǐng)求根DNS服務(wù)器桩卵;根DNS服務(wù)器是13臺(tái)根DNS验靡,會(huì)一級(jí)一級(jí)往下找。
2)TCP三次握手
客戶端先發(fā)送SYN=1雏节,ACK=0胜嗓,序列號(hào)seq=x報(bào)文;(SYN在連接建立時(shí)用來同步序號(hào)钩乍,SYN=1辞州,ACK=0代表這是一個(gè)連接請(qǐng)求報(bào)文,對(duì)方若同意建立連接件蚕,則應(yīng)在響應(yīng)報(bào)文中使SYN=1孙技,ACK=1)
服務(wù)器返回SYN=1,ACK=1排作,seq=y, ack=x+1牵啦;
客戶端再一次確認(rèn),但不用SYN了妄痪,回復(fù)服務(wù)端, ACK=1, seq=x+1, ack=y+1
3)建立TCP連接后發(fā)起HTTP請(qǐng)求
客戶端按照指定的格式開始向服務(wù)端發(fā)送HTTP請(qǐng)求哈雏,HTTP請(qǐng)求格式由四部分組成,分別是請(qǐng)求行衫生、請(qǐng)求頭裳瘪、空行、消息體罪针,服務(wù)端接收到請(qǐng)求后彭羹,解析HTTP請(qǐng)求,處理完成邏輯泪酱,最后返回一個(gè)具有標(biāo)準(zhǔn)格式的HTTP響應(yīng)給客戶端派殷。
4)服務(wù)器響應(yīng)HTTP請(qǐng)求
服務(wù)器接收處理完請(qǐng)求后返回一個(gè)HTTP響應(yīng)消息給客戶端,HTTP響應(yīng)信息格式包括:狀態(tài)行墓阀、響應(yīng)頭毡惜、空行、消息體
5)瀏覽器解析HTML代碼斯撮,請(qǐng)求HTML代碼中的資源
瀏覽器拿到html文件后经伙,就開始解析其中的html代碼,遇到j(luò)s/css/image等靜態(tài)資源時(shí)勿锅,向服務(wù)器發(fā)起一個(gè)http請(qǐng)求帕膜,如果返回304狀態(tài)碼枣氧,瀏覽器會(huì)直接讀取本地的緩存文件。否則開啟線程向服務(wù)器請(qǐng)求下載垮刹。
6)瀏覽器對(duì)頁面進(jìn)行渲染并呈現(xiàn)給用戶
7)TCP的四次揮手
當(dāng)客戶端沒有東西要發(fā)送時(shí)就要釋放連接(提出中斷連接可以是Client也可以是Server)作瞄,客戶端會(huì)發(fā)送一個(gè)FIN=1的沒有數(shù)據(jù)的報(bào)文,進(jìn)入FIN_WAIT狀態(tài)危纫,服務(wù)端收到后會(huì)給客戶端一個(gè)確認(rèn)宗挥,此時(shí)客戶端不能發(fā)送數(shù)據(jù),但可接收信息种蝶。
13契耿,Http位于TCP/IP 模型中的第幾層?為什么說Http是可靠的數(shù)據(jù)傳輸協(xié)議螃征?
TCP/IP 的五層模型:
從下到上:物理層-數(shù)據(jù)鏈路層-網(wǎng)絡(luò)層-傳輸層-應(yīng)用層
其中Tcp/ip 位于模型中的網(wǎng)絡(luò)層搪桂,處于同一層的還有ICMP(網(wǎng)絡(luò)控制信息協(xié)議),http位于模型中的應(yīng)用層
由于tcp/ip是面向鏈接的可靠協(xié)議盯滚,而http是在傳輸層基于tcp/ip西儀的踢械,所以說http也是可靠的數(shù)據(jù)傳輸協(xié)議
14,http魄藕,https的區(qū)別
此處延伸:https的實(shí)現(xiàn)原理
1内列、https協(xié)議需要到ca申請(qǐng)證書,一般免費(fèi)證書較少背率,因而需要一定費(fèi)用话瞧。
2、http是超文本傳輸協(xié)議寝姿,信息是明文傳輸交排,https則是具有安全性的ssl加密傳輸協(xié)議。
3饵筑、http和https使用的是完全不同的連接方式埃篓,用的端口也不一樣,前者是80根资,后者是443架专。
4、http的連接很簡單嫂冻,是無狀態(tài)的胶征;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸塞椎、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議桨仿,比http協(xié)議安全。
https實(shí)現(xiàn)原理:
(1)客戶使用https的URL訪問Web服務(wù)器案狠,要求與Web服務(wù)器建立SSL連接服傍。
(2)Web服務(wù)器收到客戶端請(qǐng)求后钱雷,會(huì)將網(wǎng)站的證書信息(證書中包含公鑰)傳送一份給客戶端。
(3)客戶端的瀏覽器與Web服務(wù)器開始協(xié)商SSL連接的安全等級(jí)吹零,也就是信息加密的等級(jí)罩抗。
(4)客戶端的瀏覽器根據(jù)雙方同意的安全等級(jí),建立會(huì)話密鑰灿椅,然后利用網(wǎng)站的公鑰將會(huì)話密鑰加密套蒂,并傳送給網(wǎng)站。
(5)Web服務(wù)器利用自己的私鑰解密出會(huì)話密鑰茫蛹。
(6)Web服務(wù)器利用會(huì)話密鑰加密與客戶端之間的通信操刀。