面試題有福利
TCP/IP協議簡述+
TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接.
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
SYN:同步序列編號(Synchronize Sequence Numbers)
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手
A與B建立TCP連接時:首先A向B發SYN(同步請求),然後B回覆SYN+ACK(同步請求應答),最後A回覆ACK確認,這樣TCP的一次連接(三次握手)的過程就建立了!
一、TCP報文格式
TCP/IP協議的詳細信息參看《TCP/IP協議詳解》三卷本。下面是TCP報文格式圖:
圖1 TCP報文格式
上圖中有幾個字段需要重點介紹下:
(1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
(2)確認序號:Ack序號,佔32位,只有ACK標誌位為1時,確認序號字段才有效,Ack=Seq+1。
(3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
(A)URG:緊急指針(urgent pointer)有效。
(B)ACK:確認序號有效。
(C)PSH:接收方應該儘快將這個報文交給應用層。
(D)RST:重置連接。
(E)SYN:發起一個新連接。
(F)FIN:釋放一個連接。
需要注意的是:
(A)不要將確認序號Ack與標誌位中的ACK搞混了。
(B)確認方Ack=發起方Req+1,兩端配對。
二、三次握手
所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發,整個流程如下圖所示:
圖2 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之間可以開始傳輸數據了。
SYN攻擊:
在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些偽造的SYN包將產時間佔用未連接隊列,導致正常的SYN請求因為隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:
#netstat -nap | grep SYN_RECV
三、四次揮手
三次握手耳熟能詳,四次揮手估計就,所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:
圖3 TCP四次揮手
由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。
(1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
(2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,具體流程如下圖:
圖4 同時揮手
流程和狀態在上圖中已經很明瞭了,在此不再贅述,可以參考前面的四次揮手解析步驟。
四、附註
關於三次握手與四次揮手通常都會有典型的面試題,在此提出供有需求的XDJM們參考:
(1)三次握手是什麼或者流程?四次握手呢?答案前面分析就是。
(2)為什麼建立連接是三次握手,而關閉連接卻是四次揮手呢?
這是因為服務端在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACK和SYN放在一個報文裡發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些數據給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送。
經典面試題 需要資料的後臺私信資料MF送
1. OSI與TCP/IP各層的結構與功能,都有哪些協議。
(1)OSI:七層模型。
①物理層:在物理信道上實現原始比特流的傳輸。(以太網, IEEE 802.2 等)
②數據鏈路層:實現無差錯地將數據幀從一個節點傳送到下一個相鄰節點。(Wi-Fi(IEEE 802.11) , WiMAX(IEEE 802.16), GPRS, HDLC, PPP 等協議)
③網絡層:實現將數據分組從源站通過網絡傳送到目的站,即網絡上一臺主機與另一臺主機之間的數據傳輸。(IP, ICMP, IGMP, ARP, RARP, OSPF 等協議)
④傳輸層:實現源端到目的端數據的傳輸,即某主機的某進程與另一臺主機的某進程之間的數據傳輸。(TCP, UDP 等協議)
⑤會話層:實現在不同機器上用戶建立、維護和終止會話關係。即會話層對會話提供控制管理服務、會話同步服務等。(ZIP, ASP, SSH 等協議)
⑥表示層:確保各種通信設備能夠互相操作,不及考慮其數據的內部表示。即確保即使各種通信設備其數據的內部表示不同,但仍然能相互正確操作。(SSL等協議)
⑦應用層:使用戶能夠訪問網絡,為各類應用提供相應的服務、提供各種用戶接口支持服務。應用層不是應用程序,應用層是一個為應用程序提供各類應用支持的服務層。(HTTP, FTP, SMTP, POP3, DHCP, DNS等協議)
(2)TCP/IP:四層模型。
①網絡接口層:對應物理層和數據鏈路層。
②網絡層
③傳輸層
④應用層:包括會話層、表示層、應用層。
2. TCP與UDP的區別。
(1)TCP:面向連接,可靠的,速度慢,效率低。
(2)UDP:無連接、不可靠、速度快、效率高。
當進程需要傳輸可靠的數據時應使用TCP,當進程需要高效傳輸數據,可以忽略可靠性時應使用UDP協議。
3. TCP報文結構
4. TCP的三次握手與四次揮手過程,各個狀態名稱與含義,TIMEWAIT的作用。
TimeWait作用:
1。防止上一次連接中的包,迷路後重新出現,影響新連接
(經過2MSL,上一次連接中所有的重複包都會消失)
2。可靠的關閉TCP連接
在主動關閉方發送的最後一個ack(fin) ,有可能丟失,這時被動方會重新發
fin, 如果這時主動方處於CLOSED 狀態 ,就會響應rst 而不是ack。所以
主動方要處於TIME_WAIT 狀態,而不能是CLOSED 。
TIME_WAIT 並不會佔用很大資源的,除非受到攻擊。
還有,如果一方send 或recv 超時,就會直接進入CLOSED 狀態
5. TCP擁塞控制。
(1)在通信子網出現過多數據包的情況,使得網絡的性能下降,甚至不能正常工作,這種現象就稱為擁塞。
(2)網絡擁塞的成因主要有三:1、處理器的速度太慢。2、線路容量的限制。3、節點輸出包的能力小於輸入包的能力。
(3)擁塞控制與流量控制是相關的,流量控制在數據鏈路層對一條通信路徑上的流量進行控制,其的是保證發送者的發送速度不超過接收者的接收速度,它只涉及一全發送者和一個接收者,是局部控制。擁塞控制是對整個通信子網的流量進行控制,其目的是保證通信子網中的流量與其資源相匹配,使子網不會出現性能下降和惡化、甚至崩潰,是全局控制。
(4)擁塞控制的最終目標是:1、防止由於過載而使吞吐量下降,損失效率;2、合理分配網絡資源;3、避免死鎖;4、匹配傳輸速度。
(5)對擁塞控制,可用的方法有兩類:開環控制和閉環控制。
1、開環控制的思想是通過良好的設計避免擁塞問題的出現,確保擁塞問題在開始時就不可能發生。開環控制方法包括何時接受新的通信何時丟棄包、丟棄哪些包。其特點是在作出決定時不考慮網絡當前的狀態。
2、閉環控制的思想是反饋控制。即通過將網絡工作的動態信息反饋給網絡中節點的有關進程,節點根據網絡當前的動態信息,調整轉發數據包的策略。閉環控制過程包括三部分: ①監視系統 檢測網絡發生或將要發生擁塞的時間和地點。②報告 將監視中檢測到的信息傳送到可以進行擁塞控制的節點。③決策 調整系統的操作行為,以解決問題。
(6)對應於開環控制的方法有:(基於擁塞預防)
1、預定緩衝區 2、合理分配緩衝區 3、通信量整形法(A、許可證算法,B、漏桶算法,C、令牌漏桶算法。)
對應於閉環控制的方法有:(基於擁塞抑制,即擁塞出現或即將出現時採取適當的措施進行控制,直到消除擁塞)
1、阻塞包法。 2、負載丟棄法
6. TCP滑動窗口與回退N針協議。
(2)go-back-N:為了提高信道的利用率和傳輸的效率,在未收到確認信息時允許發送方連續發送N幀數據,收方的緩衝區只能存放一幀數據。當接收方檢測出出錯的信息幀後,要求發送方重發最後一個正確接收的信息幀之後的所有未被確認的幀;或者當發送方發送了N個幀後,若發現該N幀的前一個幀在計時器超時後仍未返回其確認信息,則該幀被判為出錯或丟失,此時發送方就不得不重新發送出錯幀及其後的N幀。因為對接收方來說,由於這一幀出錯,就不能以正常的序號向它的高層遞交數據,對其後發送來的N幀也可能都不能接收而丟棄。GO-BACK-N可能將已正確傳送到目的地的數據幀再重傳一遍,這顯然是一種浪費。為了不出現二義性發方的窗口大小不得大於2n-1。
7. Http的報文結構。
(1)HTTP請求報文
一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成,下圖給出了請求報文的一般格式。
(2)HTTP響應也由三個部分組成,分別是:狀態行、消息報頭、響應正文。
8. Http的狀態碼含義。
常見的如下:
200 請求已完成 2XX狀態碼均為正常狀態碼返回。
401 未授權 請求要求進行身份驗證。登錄後,服務器可能會對頁面返回此響應。
403 已禁止 服務器拒絕請求。
404 未找到 服務器找不到請求的網頁。例如,如果請求是針對服務器上不存在的網頁進行的,那麼,服務器通常會返回此代碼。
415 不支持的媒體類型 請求的格式不受請求頁面的支持。
500 服務器內部錯誤 服務器遇到錯誤,無法完成請求。
9. Http request的幾種類型。
10. Http1.1和Http1.0的區別
11. Http怎麼處理長連接。
12. Cookie與Session的作用於原理。
13. 電腦上訪問一個網頁,整個過程是怎麼樣的:DNS、HTTP、TCP、OSPF、IP、ARP。
14. Ping的整個過程。ICMP報文是什麼。
15. C/S模式下使用socket通信,幾個關鍵函數。
16. IP地址分類。
17. 路由器與交換機區別
閱讀更多 編程資料庫 的文章