鎖屏面試題百日百刷-面試必問(wèn)四次揮手
鎖屏面試題百日百刷,每個(gè)工作日?qǐng)?jiān)持更新面試題。接下來(lái)的是今日的面試題:
====講一講TCP中的四次揮手?
?

1). 第一次揮手:Client將FIN置為1,發(fā)送一個(gè)序列號(hào)seq給Server;進(jìn)入FIN_WAIT_1狀態(tài);
2). 第二次揮手:Server收到FIN之后,發(fā)送一個(gè)ACK=1,acknowledge number=收到的序列號(hào)+1;進(jìn)入CLOSE_WAIT狀態(tài)。此時(shí)客戶端已經(jīng)沒(méi)有要發(fā)送的數(shù)據(jù)了,但仍可以接受服務(wù)器發(fā)來(lái)的數(shù)據(jù)。
3). 第三次揮手:Server將FIN置1,發(fā)送一個(gè)序列號(hào)給Client;進(jìn)入LAST_ACK狀態(tài);
4). 第四次揮手:Client收到服務(wù)器的FIN后,進(jìn)入TIME_WAIT狀態(tài);接著將ACK置1,發(fā)送一個(gè)acknowledge number=序列號(hào)+1給服務(wù)器;服務(wù)器收到后,確認(rèn)acknowledge number后,變?yōu)镃LOSED狀態(tài),不再向客戶端發(fā)送數(shù)據(jù)??蛻舳说却?*MSL(報(bào)文段最長(zhǎng)壽命)時(shí)間后,也進(jìn)入CLOSED狀態(tài)。完成四次揮手。
?
====TCP四次揮手中為什么不能把服務(wù)器發(fā)送的ACK和FIN合并起來(lái),變成三次揮手(CLOSE_WAIT狀態(tài)意義是什么)?
因?yàn)榉?wù)器收到客戶端斷開連接的請(qǐng)求時(shí),可能還有一些數(shù)據(jù)沒(méi)有發(fā)完,這時(shí)先回復(fù)ACK,表示接收到了斷開連接的請(qǐng)求。等到數(shù)據(jù)發(fā)完之后再發(fā)FIN,斷開服務(wù)器到客戶端的數(shù)據(jù)傳送。
?
====TCP四次揮手中如果第二次揮手時(shí)服務(wù)器的ACK沒(méi)有送達(dá)客戶端,會(huì)怎樣?
客戶端沒(méi)有收到ACK確認(rèn),會(huì)重新發(fā)送FIN請(qǐng)求。
?
====客戶端TIME_WAIT狀態(tài)的意義是什么?
第四次揮手時(shí),客戶端發(fā)送給服務(wù)器的ACK有可能丟失,TIME_WAIT狀態(tài)就是用來(lái)重發(fā)可能丟失的ACK報(bào)文。如果Server沒(méi)有收到ACK,就會(huì)重發(fā)FIN,如果Client在2*MSL的時(shí)間內(nèi)收到了FIN,就會(huì)重新發(fā)送ACK并再次等待2MSL,防止Server沒(méi)有收到ACK而不斷重發(fā)FIN。 MSL(Maximum?Segment Lifetime),指一個(gè)片段在網(wǎng)絡(luò)中最大的存活時(shí)間,2MSL就是一個(gè)發(fā)送和一個(gè)回復(fù)所需的最大時(shí)間。如果直到2MSL,Client都沒(méi)有再次收到FIN,那么Client推斷ACK已經(jīng)被成功接收,則結(jié)束TCP連接。
?
====什么是Socket?
網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)
Socket。Socket通常用來(lái)實(shí)現(xiàn)客戶方和服務(wù)方的連接。Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面,一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號(hào)唯一確定。
但是,Socket所支持的協(xié)議種類也不光TCP/IP、UDP,因此兩者之間是沒(méi)有必然聯(lián)系的。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。
socket連接就是所謂的長(zhǎng)連接,客戶端和服務(wù)器需要互相連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會(huì)主動(dòng)斷掉的,但是有時(shí)候網(wǎng)絡(luò)波動(dòng)還是有可能的
Socket偏向于底層。一般很少直接使用Socket來(lái)編程,框架底層使用Socket比較多。
?
====Socket通訊的過(guò)程?
1)基于TCP:服務(wù)器端先初始化Socket,然后與端口綁定(bind),對(duì)端口進(jìn)行監(jiān)聽(listen),調(diào)用accept阻塞,等待客戶端連接。在這時(shí)如果有個(gè)客戶端初始化一個(gè)Socket,然后連接服務(wù)器(connect),如果連接成功,這時(shí)客戶端與服務(wù)器端的連接就建立了??蛻舳税l(fā)送數(shù)據(jù)請(qǐng)求,服務(wù)器端接收請(qǐng)求并處理請(qǐng)求,然后把回應(yīng)數(shù)據(jù)發(fā)送給客戶端,客戶端讀取數(shù)據(jù),最后關(guān)閉連接,一次交互結(jié)束。
2)基于UDP:UDP 協(xié)議是用戶數(shù)據(jù)報(bào)協(xié)議的簡(jiǎn)稱,也用于網(wǎng)絡(luò)數(shù)據(jù)的傳輸。雖然 UDP 協(xié)議是一種不太可靠的協(xié)議,但有時(shí)在需要較快地接收數(shù)據(jù)并且可以忍受較小錯(cuò)誤的情況下,UDP 就會(huì)表現(xiàn)出更大的優(yōu)勢(shì)。我客戶端只需要發(fā)送,服務(wù)端能不能接收的到我不管
?
====java中基于TCP協(xié)議的socket代碼?
1)服務(wù)端
2)客戶端
?
====java中基于UDP協(xié)議的socket代碼?
1)服務(wù)端
2)客戶端
更多面試題或?qū)W習(xí)資源可查看我主頁(yè)或評(píng)論獲取