服務端和客戶端初始狀態:closed狀態緩存
1. 服務端:開啓服務程序,其實建立socket(5元組概念),由closed狀態--listen監聽狀態網絡
服務端從closed狀態轉換爲listen狀態(在服務端開啓相應服務),只有在listen狀態才能夠接收客戶端創建鏈接請求dom
closed--listen狀態,實際上就是建立了一個socket條目信息socket
socket條目包含五元組概念: 鏈接協議信息(tcp/udp)、目標IP地址信息、目標端口信息、源IP地址信息、源端口信息tcp
netstat -an|grep -i es --- 能夠看到socket條目信息ide
[root@wuhuang ~]# netstat -an|grep -i esspa Active Internet connections (servers and established)orm Proto Recv-Q Send-Q Local Address Foreign Address State server tcp 0 64 10.0.0.201:22 10.0.0.1:53793 ESTABLISHED blog Active UNIX domain sockets (servers and established) |
2. 客戶端:發送syn控制字段,由closed狀態---syn_send
客戶端發送syn信息給服務端,而後客戶端從closed狀態變爲syn_send狀態(三次握手的第一次握手)
3. 服務端:接收syn控制字段,回覆syn和ack字段,有listen狀態---syn_rcvd
服務端在listen狀態接收到客戶端發送的syn請求,會響應syn和ack信息,而且從listen狀態變爲syn_rcvd狀態(三次握手的第二次握手)
4. 客戶端:接收syn和ack字段,回覆ack字段,由syn_send---established鏈接創建狀態
客戶端在syn_send狀態接收到syn和ack字段信息,而後回覆ack確認信息(三次握手的第三次握手) syn_send狀態變爲最終創建鏈接的狀態(established)
5. 服務端:接收ack字段,由syn_rcvd狀態---established鏈接創建狀態
服務端在syn_rcvd狀態接收到了ack字段信息,從syn_rcvd狀態變爲established
服務端和客戶端揮手前的狀態:established狀態
6. 客戶端:發送fin字段,established狀態變爲fin_wait1狀態(等待服務端發送ack確認)
客戶端在established狀態發送fin字段信息給服務端(四次揮手過程第一次揮手)
而後客戶端狀態轉變爲fin_wait1(第一次等待:服務端的確認ack信息)
7. 服務端:接收fin字段,established狀態變爲close_wait狀態,會發送ack確認字段
服務端在established狀態接收到客戶端發送的fin字段信息,從established狀態變爲close_wait
服務端在close_wait發送ack確認字段(四次揮手的第二揮手)
8. 客戶端:接收ack字段,由fin_wait1狀態---fin_wait2(等待服務端發送fin字段)狀態
客戶端在fin_wait1狀態接收服務端的ack信息,進入到fin_wait2(第二次等待:)
沒有等來ack字段,fin_wait1狀態等來了fin字段,由fin_wait1變爲closing狀態
9. 服務端:再次發送fin字段,由close_wait狀態---last_ack狀態
服務端在close_wait發送fin斷開鏈接字段給客戶端(四次揮手的第三次揮手)
服務端從close_wait變爲last_ack狀態
10. 客戶端:接收服務端fin字段,發送最後的ack確認字段,由fin_wait2狀態---time_wait狀態
客戶端在fin_wait2狀態接收服務端的fin信息,而後響應ack信息,並將本身的狀態轉變爲time_wait狀態(四次揮手的第四次揮手)
11. 服務端:接收客戶端ack字段,由last_ack狀態---closed狀態
服務端在last_ack狀態接收到客戶端發送的ack字段信息以後,就會最終變爲closed狀態
客戶端:等必定時間(2分鐘),時間等待完成以後。纔會由time_wait---closed狀態
注意: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
[root@wuhuang ~]# netstat -nap | grep SYN_RECV |
鏈接時:
服務端在LISTEN狀態下,收到創建鏈接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。
關閉鏈接時:
當收到客戶端的FIN報文時,僅僅表示對方再也不發送數據了可是還能接收數據,服務端會向上層(應用層)彙報是否還有數據發送,並回應ACK給客戶端,而後會等數據傳輸完畢後,再發送FIN報文給對方來表示贊成如今關閉鏈接,所以,服務端ACK和FIN通常都會分開發送。
爲了確保服務端能收到ack,客戶端會在time_wait不斷給服務端發送ack。
在第二次揮手的時候,客戶端沒收到服務端發送的ack,但收到了fin字段信息,理論上收到fin後應該轉換爲time_wait,因此加了colsing起一個緩存時間(過程很快)
1. IPv4:由32位二進制(32bit)組成,通常用點分十進制來表示,將其分爲4段,每段8位二進制
2. IPv6:由128位二進制組成
IP地址的網絡部分由IANA(Internet地址分配機構)統一分配,以保證IP地址的惟一性
經常使用地址爲ABC三類地址:
A類地址(1-126):網絡部分+主機部分+主機部分+主機部分
B類地址(128-191):網絡部分+網絡部分+主機部分+主機部分
C類地址(192-223):網絡部分+網絡部分+網絡部分+主機部分
D類地址爲組播地址:每個地址都做爲一個網段
E類地址爲科學研究使用
公網地址:是互聯網上能夠識別的地址信息,而且公網IP地址全球惟一
私網地址:是局域網內能夠識別的地址信息,而且私網IP地址局域網內惟一,跨越不一樣的局域網能夠
重複使用,所以私網地址有效的緩解了地址枯竭問題
私有地址包括:
A類: 10.0.0.0-10.255.255.255
B類: 172.16.0.0-172.31.255.255
C類: 192.168.0.0-192.168.255.255
169.254.0.1——169.254.255.254,子網掩碼爲255.255.0.0 微軟內部保留地址
127.0.0.1
又稱爲本機迴環地址,一般利用在本機上ping此地址來檢查TCP/IP協議安裝是否正確
0.0.0.0
主機位全爲0的稱爲是網絡地址
255.255.255.255
主機位全位1的稱爲是廣播地址,即向全部人發出信息
主機部分爲全0表示的是網絡地址,即網段
主機部分爲全1表示的是廣播地址
所以0和255做爲主機的地址,是不能進行分配使用的,只有1-254之間的地址能夠進行分配爲主機地址使用(即主機部分不爲全0,不爲全1的是可用IP)
能夠分配的主機地址個數=2的N次方-2
注:N爲主機位的個數
-2就表示減去網絡地址和廣播地址,剩餘的就是可分配的主機地址
掩碼做用
1. 利用掩碼快速得知是A類地址 仍是B類 或是C類
2. 利用掩碼定位網絡位信息
掩碼錶現形式
用十進制表示 分爲四組 也是32位的二進制數,分爲四組,對應IP地址的網絡部分用1表示
,對應IP地址的主機部分用0表示
A類:255.0.0.0或/8
B類:255.255.0.0或/16
C類:255.255.255.0或/24
1. 會出現大量的局域網地址,同時向一個網關發送請求,引發網關設備的負載太高
2. 會引發局域網內的大量廣播數據傳送,造成廣播風暴
3. 並且會很是的浪費地址空間,有可能只有兩臺主機或者一臺,就分配一個B類地址
1. 將一個大的廣播域劃分紅幾個小的廣播域環境
2. 減小網關設備所承載的負載量
3. 有效的避免ip地址的浪費,使一個大的地址空間更加彈性和更加靈活的進行分配
子網掩碼及相關參數對應表(C類)
子網掩碼 |
子 網 數 |
主 機 數 |
可用主機數 |
/25 |
2 |
128 |
126 |
/26 |
4 |
64 |
62 |
/27 |
8 |
32 |
30 |
/28 |
16 |
16 |
14 |
/29 |
32 |
8 |
6 |
/30 |
64 |
4 |
2 |