後端面試題集——網絡部分(持續更新中)

目錄

一 TCP和UDP的區別.1

二 TCP連接中的時序圖和狀態圖.2

2.1全部11種狀態.2

2.2狀態變遷講.3

三、EPOLL的觸發模式和區別.4

、TCP連接和斷開連接時的握手方式,以及TIME_WAIT狀態、FIN_WAIT_2狀態的講解 4

4.1 TCP連接需要3次握手.4

4.2 TCP斷開需要4次握手.5

4.3 TIME_WAIT狀態的講解.5

4.4 FIN_WAIT_2狀態的講解.5

如何解決connect阻塞的問題.5

5.1 connect阻塞原理.5

5.2實現非阻塞connect的步驟.6

 

 

TCPUDP的區別

1TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據前不需要建立連接

2TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面 向報文的
UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)

4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5TCP首部開銷20字節;UDP的首部開銷小,只有8個字節

6TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

 

TCP連接中的時序圖和狀態圖

2.1全部11種狀態

客戶端獨有的:(1SYN_SENT 2FIN_WAIT1 3FIN_WAIT2 4CLOSING 5TIME_WAIT 

服務器獨有的:(1LISTEN 2SYN_RCVD 3CLOSE_WAIT 4LAST_ACK 

共有的:(1CLOSED 2ESTABLISHED 

2.2狀態變遷講解

2.2.1建立連接時的狀態變遷

        一開始,建立連接之前服務器和客戶端的狀態都爲CLOSED。服務器創建socket後開始監聽,變爲LISTEN狀態。客戶端請求建立連接,向服務器發送SYN報文,客戶端的狀態變爲SYN_SENT。服務器收到客戶端的報文後向客戶端發送ACKSYN報文,此時服務器的狀態變爲SYN_RCVD。然後,客戶端收到ACKSYN,就向服務器發送ACK,客戶端狀態變爲ESTABLISHED,服務器收到客戶端的ACK後也變爲ESTABLISHED。此時,3次握手完成,連接建立!

2.2.2斷開連接時的狀態變遷

       由於tcp連接是全雙工的,斷開連接會比建立連接麻煩一點點。客戶端先向服務器發送FIN報文,請求斷開連接,其狀態變爲FIN_WAIT1。服務器收到FIN後向客戶端發生ACK,服務器狀態變爲CLOSE_WAIT。客戶端收到ACK後就進入FIN_WAIT2狀態。此時連接已經斷開了一半了。如果服務器還有數據要發送給客戶端,就會繼續發送。直到發完了,就發送FIN報文,此時服務器進入LAST_ACK狀態。客戶端收到服務器的FIN後,馬上發送ACK給服務器,此時客戶端進入TIME_WAIT狀態,再過了2MSL長的時間後進入CLOSED狀態。服務器收到客戶端的ACK就進入CLOSED狀態。

        至此,還有一個狀態沒有提及:CLOSING狀態。CLOSING狀態表示客戶端發生了FIN,但沒有收到服務器的ACK,卻收到了服務器的FIN。這種情況發生在服務器發送的ACK丟包的時候,因爲網絡傳輸有時會有意外。

 

三、EPOLL的觸發模式和區別

四、TCP連接和斷開連接時的握手方式,以及TIME_WAIT狀態、FIN_WAIT_2狀態的講解

4.1 TCP連接需要3次握手

1 主機A通過向主機B發送一個含有同步序列號的標誌位的數據段給主機B ,向主機B請求建立連接,通過這個數據段,
主機A告訴主機B兩件事:我想要和你通信;你可以用哪個序列號作爲起始數據段來回應我.
2
主機B收到主機A的請求後,用一個帶有確認應答(ACK)和同步序列號(SYN)標誌位的數據段響應主機A,也告訴主機A兩件事:
我已經收到你的請求了,你可以傳輸數據了;你要用哪佧序列號作爲起始數據段來回應我
3
主機A收到這個數據段後,再發送一個確認應答,確認已收到主機B的數據段:"我已收到回覆,我現在要開始傳輸實際數據了

4.2 TCP斷開需要4次握手

1 當主機A完成數據傳輸後,將控制位FIN1,提出停止TCP連接的請求
2 主機B收到FIN後對其作出響應,確認這一方向上的TCP連接將關閉,ACK1
3
B端再提出反方向的關閉請求,FIN1
4
主機A對主機B的請求進行確認,ACK1,雙方向的關閉結束.
TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式,大大提高了數據通信的可靠性,使發送數據端
和接收端在數據正式傳輸前就有了交互,爲數據正式傳輸打下了可靠的基礎

4.3 TIME_WAIT狀態的講解

圖中有一個TIME_WAIT等待狀態,這個狀態又叫做2MSL狀態,說的是在TIME_WAIT2發送了最後一個ACK數據報以後,要進入TIME_WAIT狀態,這個狀態是防止最後一次握手的數據報沒有傳送到對方那裏而準備的(注意這不是四次握手,這是第四次握手的保險狀態)。這個狀態在很大程度上保證了雙方都可以正常結束,但是,問題也來了。

由於插口的2MSL狀態(插口是IP和端口對的意思,socket),使得應用程序在2MSL時間內是無法再次使用同一個插口的,對於客戶程序還好一些,但是對於服務程序,例如httpd,它總是要使用同一個端口來進行服務,而在2MSL時間內,啓動httpd就會出現錯誤(插口被使用)。爲了避免這個錯誤,服務器給出了一個平靜時間的概念,這是說在2MSL時間內,雖然可以重新啓動服務器,但是這個服務器還是要平靜的等待2MSL時間的過去才能進行下一次連接。

4.4 FIN_WAIT_2狀態的講解

這就是著名的半關閉的狀態了,這是在關閉連接時,客戶端和服務器兩次握手之後的狀態。在這個狀態下,應用程序還有接受數據的能力,但是已經無法發送數據,但是也有一種可能是,客戶端一直處於FIN_WAIT_2狀態,而服務器則一直處於WAIT_CLOSE狀態,而直到應用層來決定關閉這個狀態。

如何解決connect阻塞的問題

5.1 connect阻塞原理

TCP連接的建立涉及到一個三次握手的過程,且SOCKETconnect函數需要一直等到客戶接收到對於自己的SYNACK爲止才返回,這意味着每個connect函數總會阻塞其調用進程至少一個到服務器的RTT時間,而RTT波動範圍很大,從局域網的幾個毫秒到幾百個毫秒甚至廣域網上的幾秒。這段時間內,我們可以執行其他處理工作,以便做到並行。在此,需要用到非阻塞connect

5.2實現非阻塞connect的步驟

1、創建socket,並利用fcntl將其設置爲非阻塞

2、調用connect函數,如果返回0,則連接建立;如果返回-1,檢查errno,如果值爲 EINPROGRESS,則連接正在建立。

3、爲了控制連接建立時間,將該socket描述符加入到select的可寫集合中,採用select函數設定超時。

4、如果規定時間內成功建立,則描述符變爲可寫;否則,採用getsockopt函數捕獲錯誤信息

5、恢復套接字的文件狀態並返回。

5.3 源碼

{
                intsockfd = socket(AF_INET, SOCK_STREAM, 0);
                if(sockfd<0) exit(1);
                structsockaddr_in serv_addr;
                ………//
以服務器地址填充結構serv_addr
                interror=-1, len;
                len= sizeof(int);
                timevaltm;
                fd_setset;
                unsignedlong ul = 1;
                ioctl(sockfd,FIONBIO, &ul); //
設置爲非阻塞模式
                boolret = false;
                if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
                {
                        tm.tv_set= TIME_OUT_TIME;
                        tm.tv_uset= 0;
                        FD_ZERO(&set);
                        FD_SET(sockfd,&set);
                        if(select(sockfd+1, NULL, &set, NULL, &tm) > 0)
                        {
                                getsockopt(sockfd,SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
                             

發佈了38 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章