天天看點

TCP三向交握、四次斷開與十一種狀态

一:OSI 模型 Open System Interconnect開放系統互連參考模型,是由ISO(國際标準化組織)定義的,它是個靈活的、穩健的和可互操作的模型,OSI模型的目的是為了規範不同系統的互聯标準,使兩個不同的系統能夠較容易的通信,而不需要改變底層的硬體或軟體的邏輯,OSI模型分為七層,OSI把網絡按照層次分為七層,由下到上分别為實體層、資料鍊路層、網絡層、傳輸層、會話層、表示層、應用層。

1.1:第七層:應用層的功能:

為應用軟體提供接口,使應用程式能夠使用網絡服務。常見的應用層協定:

http(80)、ftp(20/21)、smtp(25)、pop3(110)、telnet(23)、dns(53)等

1.2:第六層:表示層的功能:

資料的編碼和解碼、資料的加密和解密、資料和壓縮和解壓縮,常見的标準有JPEG/ASCII等

1.3:第五層:會話層的功能:

建立、管理和終止表示層實體之間的會話連接配接,在設各或節點之間提供會話控制,它在系統之間協調通信過程,并提供3種不同的方式來組織它們之間的通信:單工、半雙工和全雙工

1.4:第四層:傳輸層的功能:

負責建立端到端的連接配接,保證封包在端到端之間的傳輸。提供可靠TCP及不可靠UDP的傳輸機制,服務點編址、分段與重組、連接配接控制、流量控制、差錯控制。

1.5:第三層:網絡層的功能:

定義邏輯位址,邏輯尋址,将資料分組從源傳輸到目的,路徑選擇、路由發現、維護路由表,功能是隔離廣播域;隔離廣播,路由選擇;維護路由表,尋址及轉發,流量管理并連接配接廣域網

1.6:第二層:資料鍊路層的功能:

組幀、實體編址,将資料幀從鍊路上的一個節點傳遞到另一個節點,流量控制、差錯控制、接入控制

1.7:第一層:實體層的功能:

在媒體上傳遞比特流,定義接口和媒體的實體特性,定義比特的表示、資料傳輸速率、信号的傳輸模式(單工、半雙工、全雙工),定義網絡實體拓撲(網狀、星型、環型、總線型等)

二:TCP 協定簡介:

TCP,全稱Transfer Control Protocol,中文名為傳輸控制協定,它工作在OSI的傳輸層,提供面向連接配接的可靠傳輸服務,TCP的工作主要是建立連接配接,然後從應用層程式中接收資料并進行傳輸。TCP采用虛電路連接配接方式進行工作,在發送資料前它需要在發送方和接收方建立一個連接配接,資料在發送出去後,發送方會等待接收方給出一個确認性的應答,否則發送方将認為此資料丢失,并重新發送此資料。

三:TCP三向交握:

在建立連接配接的時候,所謂的用戶端與服務端是相對應的,即要看是誰主動連接配接的誰,如果A主動連接配接B那麼A就是用戶端而B是服務端,如果返過來B主動連接配接A,那麼B就是用戶端而A就成了服務端。

3.1:連接配接過程:

第一次握手:用戶端發送SYN标志位為1的請求到服務端,并随機生成一個seq 序列号x,其中seq是随機産生的資料包的序列号。

第二次握手:伺服器收到用戶端請求并傳回SYN=1,ACK=1,seq=y,ack=x+1,其中ACK=1表示是響應封包,seq=y是伺服器随機産生的資料包序列号,ack=x+1是确認用戶端序列号有效并傳回給用戶端确認。

第三次握手:用戶端收到伺服器的确認ack=x+1有效的驗證資訊,即在自己發送的序列号基礎之上加了1表示伺服器收到并傳回,表示第二次連接配接有效,然後用戶端恢回複ACK=1,seq=x+1,ack=y+1,這是講伺服器發來+1後的序列号當做自己的seq序列号,确認号ack使用伺服器的随機号y再加1即ack=y+1,這樣用戶端就完成了第三次的驗證在講資料包發給伺服器,伺服器收到後驗證确認号是在自己的seq之上加了1,表示沒有問題就開始傳輸資料。

注:

ACK :TCP協定規定,隻有ACK=1時有效,也規定連接配接建立後所有發送的封包的ACK必須為1

Seq:序号,4位元組,範圍為0^32—1^32,共4284967296,達到時重新開始計算

在第三次的時候SYN等于0,因為SYN(SYNchronization) 隻i在連接配接建立時用來同步序号,當SYN=1而ACK=0時,表明這是一個連接配接請求封包,對方若同意建立連接配接,則應在響應封包中使SYN=1和ACK=1. 是以, SYN置1就表示這是一個連接配接請求或連接配接接受封包,鍊路建立成功之後就将标志位置為0。

SYN(synchronous建立聯機) ACK(acknowledgement 确認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急) Sequence number(順序号碼) Acknowledge number(确認号碼)

TCP三向交握、四次斷開與十一種狀态
四:TCP的四次斷開:

TCP斷開要四次是因為TCP傳輸數全雙工的,即資料是在同一時間内兩條資料鍊路雙向互相傳輸的,是以每個方向都要單獨關閉一次,斷開需要用戶端到服務端斷開一次,而服務端到用戶端也需要斷開一次,這樣的斷開才是完整的斷開,

第一次斷開:客戶方發給伺服器一個FIN為1的請求,FIN為1表示是一個斷開連接配接的請求,即表示資料傳輸完畢請求斷開,并發送seq序列号和Ack确認号。

第二次斷開:伺服器收到用戶端請求并傳回ACK标志位為1,Ack為Seq+1等于201,并将對方的Ack作為自己的Seq序列号的确認資料包,biao 接收到請求同意斷開。

第三次斷開:伺服器發送ACK=1,FIN=1,Seq等于用戶端第一次請求斷開的Ack确認号+1,即Seq等于501的斷開請求給用戶端。

第四次斷開:用戶端發送ACK=1,Ack在上一步Seq上+1等于502,并使用在第二次斷開中伺服器發送的Ack确号201作為本次的序列号發給伺服器表示同意斷開,伺服器收到後驗證序列号是第二次的,驗證Ack是第三次+1的,确認沒有問題後同意斷開,然後将端口置為TIME_WAIT狀态,等待2 MSL時間後置為關閉狀态,被動方收到主動方的封包确認Ack确認号沒有問題後将端口置為CLOSED,至此端口關閉。

SYN(synchronous建立聯機) ACK(acknowledgement 确認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急) Sequence number(順序号碼) Acknowledge number(确認号碼)

四次斷開的圖形示意如下:

TCP三向交握、四次斷開與十一種狀态
五:TCP端口的十一種連接配接狀态:

TCP端口一共有十一種狀态,CLOSE_WAIT表示是程式y關閉連接配接,而TIME_WAIT隻占用一個socket連接配接,到時間之後會釋放,是以大量的CLOSE_WAIT是比大量的TIME_WAIT影響更大,另外還有FIN_WAIT1和FIN_WAIT2,如果有FIN_WAIT2也表示服務有問題,以下是每個端口狀态的含義:

5.1:CLOSED:端口預設是關閉狀态。

5.2:LISTEN: 伺服器程式開始監聽一個端口,就是LISTEN狀态。

5.3:SYN_RCVD:三次握手的第二次握手後的端口狀态,是收到了用戶端發送的SYN_SENT資料包之後的狀态,這個狀态很短暫,正常在伺服器上是很少看到的,除非伺服器故意不發送最後一次握手資料包,伺服器傳回給用戶端SYN确認之後就會将在自己的端口置為SYN_RCVD。

5.4:SYN_SENT:SYN_SENT狀态表示用戶端已發送SYN=1的請求連接配接封包,發送之後用戶端就會将自己的端口狀态置為SYN_SENT。

5.5:ESTABLISHED:表示已經連接配接成功,用戶端收到伺服器的确認封包會回複伺服器,然後就将端口置為ESTABLISHED,伺服器第三次收到用戶端的Ack确認就會将端口置為ESTABLISHED并開始傳輸資料。

5.6:FIN_WAIT_1:出現在主動關閉方,FIN_WAIT_1狀态實際上是當SOCKET在ESTABLISHED狀态時,當任意一方想主動關閉連接配接,向對方發送了FIN=1的斷開連接配接請求封包,此時該SOCKET即 進入到FIN_WAIT_1狀态。而當對方回應ACK封包後,則進入到FIN_WAIT_2狀态,當然在實際的正常情況下,無論對方何種情況下,都應該馬 上回應ACK封包,是以FIN_WAIT_1狀态一般是比較難見到的,而FIN_WAIT_2狀态還有時常常可以用netstat看到。

5.7:FIN_WAIT_2:出現在主動關閉方,當被動方回應FIN_WAIT_1的ACK封包後,則進入到FIN_WAIT_2狀态

5.8:TIME_WAIT:出現在主動關閉方,表示收到了對方的FIN請求關閉封包,并發送出了ACK封包,就等2MSL後即可回到CLOSED可用狀态了。如果FIN_WAIT_1狀态下,收到了對方同時帶FIN标志和ACK标志的封包時,可以直接進入到TIME_WAIT狀态,而無須經過FIN_WAIT_2狀态。

5.9:CLOSING: 這種狀态比較特殊,實際情況中應該是很少見,屬于一種比較罕見的例外狀态。正常情況下,當你發送FIN封包後,按理來說是應該先收到(或同時收到)對方的 ACK封包,再收到對方的FIN封包。但是CLOSING狀态表示你發送FIN封包後,并沒有收到對方的ACK封包,反而卻也收到了對方的FIN封包。什 麼情況下會出現此種情況呢?其實細想一下,也不難得出結論:那就是如果雙方幾乎在同時close一個SOCKET的話,那麼就出現了雙方同時發送FIN報 文的情況,也即會出現CLOSING狀态,表示雙方都正在關閉SOCKET連接配接。

5.10:CLOSE_WAIT: 表示在等待關閉端口,這種狀态存在于被動關閉的一方。

5.11:LAST_ACK: 是被動關閉方在主動關閉一方在發送FIN封包後,最後等待對方的ACK封包,當再次收到ACK封包後,也即可以進入到CLOSED可用狀态了。

5.12:區分主動斷開和被動端口方的端口狀态:

主動端口方:SYN_SENT、FIN_WAIT1、FIN_WAIT2、CLOSING、TIME_WAIT 。

被動斷開方:LISTEN、SYN_RCVD、CLOSE_WAIT、LAST_ACK 。

都具有的:CLOSED 、ESTABLISHED 。

TCP三向交握、四次斷開與十一種狀态

5.13:關于優化:

socket就是一個TCP連接配接,包括源位址、源端口、目标位址、目标端口和協定(TCP|UDP),0端口是保留不能使用的,是以伺服器的最大端口使用數量為63353個,最大65536個端口是因為TCP封包頭部有個端口長度為2^16次方等于65536,檢視目前打開的端口範圍# cat /proc/sys/net/ipv4/ip_local_port_range,單個IP位址能接受的最大并發為六萬多,1萬個TIME_WAIT大約使用1MB的記憶體CPU占用更小,是以資源使用很小可以忽略不計,但是會占用一個socket,可以通過在負載上配置多個公網IP位址以提高高并發的問題,

[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle

0 #用于快速回收處于TIME_WAIT狀态的socket以便重新分,在負載伺服器不能打開,會導緻通過nat上網的後續使用者無法打開網頁,因為後面的通路使用者時間戳小于前面的使用者,會導緻資料包被負載伺服器丢棄,可以在内網使用,但是通常建議關閉。

[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse

0 #kernel會複用處于TIME_WAIT狀态的socket,即允許将TIME_WAIT狀态得socket用于直接新的TCP連接配接,負載伺服器建議打開

[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_timestamps

1 #記錄資料包的時間戳,判斷是新的資料包還是舊的,如果是舊的就丢棄,配合上面兩個選項的時候一定要打開才生效。

六:Apache的工作模式:

Apache 2.X 支援插入式并行處理子產品,稱為多路處理子產品(Multi-Processing Modules,MPM),在linux 系統,有3個不同類型的版本可供選擇,具體如下:

6.1:Prefork MPM: 預派生模式,有一個主要制程序,然後生成多個子程序,使用select模型,最大并發1024,每個子程序有一個獨立的線程響應使用者請求,相對比較占用記憶體,但是比較穩定,可以設定最大和最小程序數,是最古老的一種模式,也是最穩定的模式,适用于通路量不是很大的場景。

優點:穩定

缺點:慢,占用資源,不适用于高并發場景

TCP三向交握、四次斷開與十一種狀态

配置檔案原内容:

#prefork MPM

#StartServers: number of server processes to start

#MinSpareServers: minimum number of server processes which are kept spare

#MaxSpareServers: maximum number of server processes which are kept spare

#MaxRequestWorkers: maximum number of server processes allowed to start

#MaxConnectionsPerChild: maximum number of connections a server process serves

#before terminating