● 請你說一下TCP怎么保證可靠性,並且簡述一下TCP建立連接和斷開連接的過程
參考回答:
TCP保證可靠性:
(1)序列號、確認應答、超時重傳
數據到達接收方,接收方需要發出一個確認應答,表示已經收到該數據段,並且確認序號會說明了它下一次需要接收的數據序列號。如果發送發遲遲未收到確認應答,那么可能是發送的數據丟失,也可能是確認應答丟失,這時發送方在等待一定時間后會進行重傳。這個時間一般是2*RTT(報文段往返時間)+一個偏差值。
(2)窗口控制與高速重發控制/快速重傳(重復確認應答)
TCP會利用窗口控制來提高傳輸速度,意思是在一個窗口大小內,不用一定要等到應答才能發送下一段數據,窗口大小就是無需等待確認而可以繼續發送數據的最大值。如果不使用窗口控制,每一個沒收到確認應答的數據都要重發。
使用窗口控制,如果數據段1001-2000丟失,后面數據每次傳輸,確認應答都會不停地發送序號為1001的應答,表示我要接收1001開始的數據,發送端如果收到3次相同應答,就會立刻進行重發;但還有種情況有可能是數據都收到了,但是有的應答丟失了,這種情況不會進行重發,因為發送端知道,如果是數據段丟失,接收端不會放過它的,會瘋狂向它提醒......
(3)擁塞控制
如果把窗口定的很大,發送端連續發送大量的數據,可能會造成網絡的擁堵(大家都在用網,你在這狂發,吞吐量就那么大,當然會堵),甚至造成網絡的癱瘓。所以TCP在為了防止這種情況而進行了擁塞控制。
慢啟動:定義擁塞窗口,一開始將該窗口大小設為1,之后每次收到確認應答(經過一個rtt),將擁塞窗口大小*2。
擁塞避免:設置慢啟動閾值,一般開始都設為65536。擁塞避免是指當擁塞窗口大小達到這個閾值,擁塞窗口的值不再指數上升,而是加法增加(每次確認應答/每個rtt,擁塞窗口大小+1),以此來避免擁塞。
將報文段的超時重傳看做擁塞,則一旦發生超時重傳,我們需要先將閾值設為當前窗口大小的一半,並且將窗口大小設為初值1,然后重新進入慢啟動過程。
快速重傳:在遇到3次重復確認應答(高速重發控制)時,代表收到了3個報文段,但是這之前的1個段丟失了,便對它進行立即重傳。
然后,先將閾值設為當前窗口大小的一半,然后將擁塞窗口大小設為慢啟動閾值+3的大小。
這樣可以達到:在TCP通信時,網絡吞吐量呈現逐漸的上升,並且隨着擁堵來降低吞吐量,再進入慢慢上升的過程,網絡不會輕易的發生癱瘓。
TCP建立連接和斷開連接的過程:

三次握手:
1. Client將標志位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
2. Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
3. Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client與Server之間可以開始傳輸數據了。
四次揮手:
由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務后,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉。
1.數據傳輸結束后,客戶端的應用進程發出連接釋放報文段,並停止發送數據,客戶端進入FIN_WAIT_1狀態,此時客戶端依然可以接收服務器發送來的數據。
2.服務器接收到FIN后,發送一個ACK給客戶端,確認序號為收到的序號+1,服務器進入CLOSE_WAIT狀態。客戶端收到后進入FIN_WAIT_2狀態。
3.當服務器沒有數據要發送時,服務器發送一個FIN報文,此時服務器進入LAST_ACK狀態,等待客戶端的確認
4.客戶端收到服務器的FIN報文后,給服務器發送一個ACK報文,確認序列號為收到的序號+1。此時客戶端進入TIME_WAIT狀態,等待2MSL(MSL:報文段最大生存時間),然后關閉連接。
● 請你說一說TCP的模型,狀態轉移
參考回答:
四層TCP/IP模型如下:

其狀態轉移圖如下:

● 請回答一下HTTP和HTTPS的區別,以及HTTPS有什么缺點?
參考回答:
HTTP協議和HTTPS協議區別如下:1)HTTP協議是以明文的方式在網絡中傳輸數據,而HTTPS協議傳輸的數據則是經過TLS加密后的,HTTPS具有更高的安全性
2)HTTPS在TCP三次握手階段之后,還需要進行SSL 的handshake,協商加密使用的對稱加密密鑰
3)HTTPS協議需要服務端申請證書,瀏覽器端安裝對應的根證書
4)HTTP協議端口是80,HTTPS協議端口是443
HTTPS優點:
HTTPS傳輸數據過程中使用密鑰進行加密,所以安全性更高
HTTPS協議可以認證用戶和服務器,確保數據發送到正確的用戶和服務器
HTTPS缺點:
HTTPS握手階段延時較高:由於在進行HTTP會話之前還需要進行SSL握手,因此HTTPS協議握手階段延時增加
HTTPS部署成本高:一方面HTTPS協議需要使用證書來驗證自身的安全性,所以需要購買CA證書;另一方面由於采用HTTPS協議需要進行加解密的計算,占用CPU資源較多,需要的服務器配置或數目高
● 請你說一說HTTP和HTTPS的不同
參考回答:
1)HTTP協議是以明文的方式在網絡中傳輸數據,而HTTPS協議傳輸的數據則是經過TLS加密后的,HTTPS具有更高的安全性
2)HTTPS在TCP三次握手階段之后,還需要進行SSL 的handshake,協商加密使用的對稱加密密鑰
3)HTTPS協議需要服務端申請證書,瀏覽器端安裝對應的根證書
4)HTTP協議端口是80,HTTPS協議端口是443
● 請你說一說HTTP返回碼
參考回答:
1xx:指示信息--表示請求已接收,繼續處理。
2xx:成功--表示請求已被成功接收、理解、接受。
3xx:重定向--要完成請求必須進行更進一步的操作。
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現。
5xx:服務器端錯誤--服務器未能實現合法的請求。
常見狀態代碼、狀態描述的詳細說明如下。
200 OK:客戶端請求成功。
206 partial content服務器已經正確處理部分GET請求,實現斷點續傳或同時分片下載,該請求必須包含Range請求頭來指示客戶端期望得到的范圍
300 multiple choices(可選重定向):被請求的資源有一系列可供選擇的反饋信息,由瀏覽器/用戶自行選擇其中一個。
301 moved permanently(永久重定向):該資源已被永久移動到新位置,將來任何對該資源的訪問都要使用本響應返回的若干個URI之一。
302 move temporarily(臨時重定向):請求的資源現在臨時從不同的URI中獲得,
304:not modified :如果客戶端發送一個待條件的GET請求並且該請求以經被允許,而文檔內容未被改變,則返回304,該響應不包含包體(即可直接使用緩存)。
403 Forbidden:服務器收到請求,但是拒絕提供服務。
t Found:請求資源不存在,舉個例子:輸入了錯誤的URL。
● 請你說一說IP地址作用,以及MAC地址作用
參考回答:
● 請介紹一下操作系統中的中斷
參考回答:
中斷是指CPU對系統發生的某個事件做出的一種反應,CPU暫停正在執行的程序,保存現場后自動去執行相應的處理程序,處理完該事件后再返回中斷處繼續執行原來的程序。中斷一般三類,一種是由CPU外部引起的,如I/O中斷、時鍾中斷,一種是來自CPU內部事件或程序執行中引起的中斷,例如程序非法操作,地址越界、浮點溢出),最后一種是在程序中使用了系統調用引起的。而中斷處理一般分為中斷響應和中斷處理兩個步驟,中斷響應由硬件實施,中斷處理主要由軟件實施。
● 請回答OSI七層模型和TCP/IP四層模型,每層列舉2個協議
參考回答:
物理層: 通過媒介傳輸比特,確定機械及電氣規范,傳輸單位為bit,主要包括的協議為:IEE802.3 CLOCK RJ45
數據鏈路層: 將比特組裝成幀和點到點的傳遞,傳輸單位為幀,主要包括的協議為MAC VLAN PPP
網絡層:負責數據包從源到宿的傳遞和網際互連,傳輸單位為包,主要包括的協議為IP ARP ICMP
傳輸層:提供端到端的可靠報文傳遞和錯誤恢復,傳輸單位為報文,主要包括的協議為TCP UDP
會話層:建立、管理和終止會話,傳輸單位為SPDU,主要包括的協議為RPC NFS
表示層: 對數據進行翻譯、加密和壓縮,傳輸單位為PPDU,主要包括的協議為JPEG ASII
應用層: 允許訪問OSI環境的手段,傳輸單位為APDU,主要包括的協議為FTP HTTP DNS
TCP/IP 4層模型包括:
網絡接口層:MAC VLAN
網絡層:IP ARP ICMP
傳輸層:TCP UDP
應用層:HTTP DNS SMTP
● 請你說一說TCP的三次握手和四次揮手的過程及原因
參考回答:
C-> SYN -> S
S->SYN/ACK->C
C->ACK->S
三次握手的原因:三次握手可以防止已經失效的連接請求報文突然又傳輸到服務器端導致的服務器資源浪費。例如,客戶端先發送了一個SYN,但是由於網絡阻塞,該SYN數據包在某個節點長期滯留。然后客戶端又重傳SYN數據包並正確建立TCP連接,然后傳輸完數據后關閉該連接。該連接釋放后失效的SYN數據包才到達服務器端。在二次握手的前提下,服務器端會認為這是客戶端發起的又一次請求,然后發送SYN ,並且在服務器端創建socket套接字,一直等待客戶端發送數據。但是由於客戶端並沒有發起新的請求,所以會丟棄服務端的SYN 。此時服務器會一直等待客戶端發送數據從而造成資源浪費。
TCP的四次揮手過程如下:
C->FIN->S
S->ACK->C
S->FIN->C
C->ACK->S
四次揮手的原因:由於連接的關閉控制權在應用層,所以被動關閉的一方在接收到FIN包時,TCP協議棧會直接發送一個ACK確認包,優先關閉一端的通信。然后通知應用層,由應用層決定什么時候發送FIN包。應用層可以使用系統調用函數read==0來判斷對端是否關閉連接。
● 搜索baidu,會用到計算機網絡中的什么層?每層是干什么的
參考回答:
瀏覽器要將URL解析為IP地址,解析域名就要用到DNS協議,首先主機會查詢DNS的緩存,如果沒有就給本地DNS發送查詢請求。DNS查詢分為兩種方式,一種是遞歸查詢,一種是迭代查詢。如果是迭代查詢,本地的DNS服務器,向根域名服務器發送查詢請求,根域名服務器告知該域名的一級域名服務器,然后本地服務器給該一級域名服務器發送查詢請求,然后依次類推直到查詢到該域名的IP地址。DNS服務器是基於UDP的,因此會用到UDP協議。
得到IP地址后,瀏覽器就要與服務器建立一個http連接。因此要用到http協議,http協議報文格式上面已經提到。http生成一個get請求報文,將該報文傳給TCP層處理,所以還會用到TCP協議。如果采用https還會使用https協議先對http數據進行加密。TCP層如果有需要先將HTTP數據包分片,分片依據路徑MTU和MSS。TCP的數據包然后會發送給IP層,用到IP協議。IP層通過路由選路,一跳一跳發送到目的地址。當然在一個網段內的尋址是通過以太網協議實現(也可以是其他物理層協議,比如PPP,SLIP),以太網協議需要直到目的IP地址的物理地址,有需要ARP協議。
其中:
1、DNS協議,http協議,https協議屬於應用層
應用層是體系結構中的最高層。應用層確定進程之間通信的性質以滿足用戶的需要。這里的進程就是指正在運行的程序。應用層不僅要提供應用進程所需要的信息交換和遠地操作,而且還要作為互相作用的應用進程的用戶代理,來完成一些為進行語義上有意義的信息交換所必須的功能。應用層直接為用戶的應用進程提供服務。
2、TCP/UDP屬於傳輸層
傳輸層的任務就是負責主機中兩個進程之間的通信。因特網的傳輸層可使用兩種不同協議:即面向連接的傳輸控制協議TCP,和無連接的用戶數據報協議UDP。面向連接的服務能夠提供可靠的交付,但無連接服務則不保證提供可靠的交付,它只是“盡最大努力交付”。這兩種服務方式都很有用,備有其優缺點。在分組交換網內的各個交換結點機都沒有傳輸層。
3、IP協議,ARP協議屬於網絡層
網絡層負責為分組交換網上的不同主機提供通信。在發送數據時,網絡層將運輸層產生的報文段或用戶數據報封裝成分組或包進行傳送。在TCP/IP體系中,分組也叫作IP數據報,或簡稱為數據報。網絡層的另一個任務就是要選擇合適的路由,使源主機運輸層所傳下來的分組能夠交付到目的主機。
4、數據鏈路層
當發送數據時,數據鏈路層的任務是將在網絡層交下來的IP數據報組裝成幀,在兩個相鄰結點間的鏈路上傳送以幀為單位的數據。每一幀包括數據和必要的控制信息(如同步信息、地址信息、差錯控制、以及流量控制信息等)。控制信息使接收端能夠知道—個幀從哪個比特開始和到哪個比特結束。控制信息還使接收端能夠檢測到所收到的幀中有無差錯。
5、物理層
物理層的任務就是透明地傳送比特流。在物理層上所傳數據的單位是比特。傳遞信息所利用的一些物理媒體,如雙絞線、同軸電纜、光纜等,並不在物理層之內而是在物理層的下面。因此也有人把物理媒體當做第0層。
● 請你說一說TCP擁塞控制?以及達到什么情況的時候開始減慢增長的速度?
參考回答:
1、慢開始
最開始發送方的擁塞窗口為1,由小到大逐漸增大發送窗口和擁塞窗口。每經過一個傳輸輪次,擁塞窗口cwnd加倍。當cwnd超過慢開始門限,則使用擁塞避免算法,避免cwnd增長過大。
2、擁塞避免
每經過一個往返時間RTT,cwnd就增長1。
在慢開始和擁塞避免的過程中,一旦發現網絡擁塞,就把慢開始門限設為當前值的一半,並且重新設置cwnd為1,重新慢啟動。(乘法減小,加法增大)
3、快重傳
接收方每次收到一個失序的報文段后就立即發出重復確認,發送方只要連續收到三個重復確認就立即重傳(盡早重傳未被確認的報文段)。
4、快恢復
當發送方連續收到了三個重復確認,就乘法減半(慢開始門限減半),將當前的cwnd設置為慢開始門限,並且采用擁塞避免算法(連續收到了三個重復請求,說明當前網絡可能沒有擁塞)。
采用快恢復算法時,慢開始只在建立連接和網絡超時才使用。
達到什么情況的時候開始減慢增長的速度?
采用慢開始和擁塞避免算法的時候
1. 一旦cwnd>慢開始門限,就采用擁塞避免算法,減慢增長速度
2. 一旦出現丟包的情況,就重新進行慢開始,減慢增長速度
采用快恢復和快重傳算法的時候
1. 一旦cwnd>慢開始門限,就采用擁塞避免算法,減慢增長速度
2. 一旦發送方連續收到了三個重復確認,就采用擁塞避免算法,減慢增長速度
● 請問TCP用了哪些措施保證其可靠性
參考回答:
數據到達接收方,接收方需要發出一個確認應答,表示已經收到該數據段,並且確認序號會說明了它下一次需要接收的數據序列號。如果發送發遲遲未收到確認應答,那么可能是發送的數據丟失,也可能是確認應答丟失,這時發送方在等待一定時間后會進行重傳。這個時間一般是2*RTT(報文段往返時間)+一個偏差值。
2、窗口控制與高速重發控制/快速重傳(重復確認應答)
TCP會利用窗口控制來提高傳輸速度,意思是在一個窗口大小內,不用一定要等到應答才能發送下一段數據,窗口大小就是無需等待確認而可以繼續發送數據的最大值。如果不使用窗口控制,每一個沒收到確認應答的數據都要重發。
使用窗口控制,如果數據段1001-2000丟失,后面數據每次傳輸,確認應答都會不停地發送序號為1001的應答,表示我要接收1001開始的數據,發送端如果收到3次相同應答,就會立刻進行重發;但還有種情況有可能是數據都收到了,但是有的應答丟失了,這種情況不會進行重發,因為發送端知道,如果是數據段丟失,接收端不會放過它的,會瘋狂向它提醒......
3、擁塞控制
如果把窗口定的很大,發送端連續發送大量的數據,可能會造成網絡的擁堵(大家都在用網,你在這狂發,吞吐量就那么大,當然會堵),甚至造成網絡的癱瘓。所以TCP在為了防止這種情況而進行了擁塞控制。
慢啟動:定義擁塞窗口,一開始將該窗口大小設為1,之后每次收到確認應答(經過一個rtt),將擁塞窗口大小*2。
擁塞避免:設置慢啟動閾值,一般開始都設為65536。擁塞避免是指當擁塞窗口大小達到這個閾值,擁塞窗口的值不再指數上升,而是加法增加(每次確認應答/每個rtt,擁塞窗口大小+1),以此來避免擁塞。
將報文段的超時重傳看做擁塞,則一旦發生超時重傳,我們需要先將閾值設為當前窗口大小的一半,並且將窗口大小設為初值1,然后重新進入慢啟動過程。
快速重傳:在遇到3次重復確認應答(高速重發控制)時,代表收到了3個報文段,但是這之前的1個段丟失了,便對它進行立即重傳。
然后,先將閾值設為當前窗口大小的一半,然后將擁塞窗口大小設為慢啟動閾值+3的大小。
這樣可以達到:在TCP通信時,網絡吞吐量呈現逐漸的上升,並且隨着擁堵來降低吞吐量,再進入慢慢上升的過程,網絡不會輕易的發生癱瘓。
TCP三次握手
深信服
TCP的三次握手過程如下:
1)首先客戶端發送seq=c的SYN數據包
服務器端響應一個seq=s,ack=c+1的SYN+ACK數據包
最后客戶端回復一個seq=c+1,ack=s+1的ACK數據包,三次握手完成
● 請你說說TCP/IP數據鏈路層的交互過程
參考回答:
● 請你說說傳遞到IP層怎么知道報文該給哪個應用程序,它怎么區分UDP報文還是TCP報文
參考回答:
看ip頭中的協議標識字段,17是udp,6是tcp
● 請問你有沒有基於做過socket的開發?具體網絡層的操作該怎么做?(其實也是問網絡編程的基本步驟)
參考回答:
客戶端:socket-connect