您好,登錄后才能下訂單哦!
一、TCP/IP模型
? ? ? ?Transmission Control Protocol/Internet Protocol傳輸控制協議/因特網互聯協議 ,TCP/IP是一個Protocol Stack(協議棧),包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等許多協議 最早發源于美國國防部(縮寫為DoD)的因特網的前身ARPA網項目,1983年1月1日,TCP/IP取代了舊的網絡控制協議NCP,成為今天的互聯網和局域網的基石和標準,由互聯網工程任務組負責維護,共定義了四層 。
TCP/IP協議棧和ISO參考模型的分層有對應關系 :
二、TCP/IP端口劃分:
傳輸層通過port號,確定應用層協議?
Port number: 端口號
tcp:傳輸控制協議,面向連接的協議;通信前需要建立虛擬鏈路;結束后拆除鏈路?
0-65535?
udp:User Datagram Protocol,無連接的協議?
0-65535?
IANA:互聯網數字分配機構(負責域名,數字資源,協議分配)?
0-1023:系統端口或特權端口(僅管理員可用) ,眾所周知,永久的分配給固定的
系統應用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)?
1024-49151:用戶端口或注冊端口,但要求并不嚴格,分配給程序注冊為某應
用使用,1433/tcp(SqlServer), 1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp?
(memcached)?
49152-65535:動態端口或私有端口,客戶端程序隨機使用的端口?
其范圍的定義:/proc/sys/net/ipv4/ip_local_port_range?
/etc/services:記錄了應用服務的端口號,各種協議的端口號
常見的一些端口號要記住:
snmp 161/tcp http? 80/tcp? https? 443/tcp kerberos? 88/tcp?網絡授權協議,用來在非安全網絡中,對個人通信以安全的手段進行身份認證 smtp? 25/tcp pop3? 110/tcp imap? 143/tcp smb? 445/tcp dns 53/tcp dhcp/s 67/udp dhcp/c 68/udp dns 53/udp qq? 8000/udp
三、TCP的特性
????工作在傳輸層? ????面向連接協議? ????全雙工協議? ????半關閉? ????錯誤檢查? ????將數據打包成段,排序? ????確認機制? ????數據恢復,重傳? ????流量控制,滑動窗口? ????擁塞控制,慢啟動和擁塞避免算法
四、TCP的包頭結構
TCP包頭結構介紹
TCP包頭? 源端口、目標端口:計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。 ??????????????????源端口、目標端口是用16位表示的,可推算計算機的端口個數為2^16個? 序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由于序列號由32位表示,所以每2^32個字節,就會出現序列號回繞,再次從?0?開始? 確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送方:我希望你(指發送方)下次發送的數據的第一個字節數據的編號為此確認號? 數據偏移:表示TCP報文段的首部長度,共4位,由于TCP首部包含一個長度可變的選項部分,需要指定這個TCP報文段到底有多長。它指出?TCP?報文段的數據起始處距離?TCP?報文段的起始處有多遠。 ??????????該字段的單位是32位(即4個字節為計算單位),4位二進制最大表示15,所以數據偏移也就是TCP首部最大60字節? URG:表示本報文段中發送的數據是否包含緊急數據。后面的緊急指針字段(urgent?pointer)只有當URG=1時才有效? ACK:表示是否前面確認號字段是否有效。只有當ACK=1時,前面的確認號字段才有效。TCP規定,連接建立后,ACK必須為1,帶ACK標志的TCP報文段稱為確認報文段? PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收后續數據騰出空間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數據讀走, ?????就會一直停留在TCP接收緩沖區中? RST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然后再重新建立連接。或者說明上次發送給主機的數據有問題,主機拒絕響應, ?????帶RST標志的TCP報文段稱為復位報文段? SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求 ?????建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標志的TCP報文段稱為同步報文段? FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方:“我的數據已經發送完畢,你可以釋放連接了”,帶FIN標志的TCP報文段稱為結束報文段? 窗口大小:表示現在允許對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量,達到此值,需要ACK確認后才能再繼續傳送后面數據,由Window?size?value?*?Window?size?scaling?factor (此值在三次握手階段TCP選項Window?scale協商得到)得出此值? 校驗和:提供額外的可靠性? 緊急指針:標記緊急數據在數據字段中的位置? 選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40字節? ??常見選項:? 最大報文段長度:Maxium?Segment?Size,MSS,通常1460字節? 窗口擴大:Window?Scale? 時間戳:?Timestamps
五、TCP的三次握手
TCP三次握手的簡單介紹
第一次握手:首先要保證服務端的服務端口處于LISTEN監聽的狀態,這時客戶端主動發送請求并進入到(SYN-SENT)狀態,使用49152-65535其中隨機的一個端口向服務端的服務端口發送請求,發送兩個報文 ????????????SYN=1同步序號請求,發出seq=x本機序號。 第二次握手:服務端當接收到客戶端的請求連接時,立即做出響應,并進入到SEND_RCVD等待客戶端確認,服務端會向客戶端發送4個報文SYN=1同步序號請求,ACK=1是確認客戶端發送的SYN同步序號確認報文已經收到, ????????????服務端發送自己的序號seq=y,同時還會發送一個ack=x+1(表示客戶端發送的seq=x報文包在服務端已經確認收到,下次在發送報文時發送x包的下一個包也就是x+1的包)。 第三次握手:當客戶端收到服務端的回應時,客戶端會立即做出響應并進入到ESTABLISHED已建立連接的狀態?,客戶端會回復給服務端4個報文,ACK=1(表示服務端發送的SYN報文已經收到),seq=x+1(就是第一次發送的是x的報文包這次 ????????????就要發送下一個包了就是x+1的報文),ack=y+1(表示服務端向客戶端發起的seq=y客戶端已收到下次在發送就要發送y報文的下一個包)。當服務端收到響應立即進入到狀態,TCP的連接建立可以進行數據傳送 為什么是三次握手而不是兩次或者四次呢? ??如果是兩次的話,當客戶端第一次發送請求給服務端,服務端收到請求并回應給客戶端服務端確認已收到客戶端的請求,第二次則是服務端向客戶端返回確認包已收到請求,并同時發送服務端向客戶端連接的請求, ??如果沒有第三次的話,服務端根本不清楚客戶端是否已收到服務端發給客戶端的確認包及請求包,所以三次握手也就是保證tcp建立鏈接可靠保證安全的,要完全建立TCP的連接必須經過雙方確認才可以,建立起 ??TCP的連接之后才可以進行數據的傳送 第四次則是雙方已經開始交換數據了
三次握手的半連接隊列和全連接隊列:
半連接隊列和全連接隊列的介紹
半連接隊列:其中我們說的3次握手實際上發送一個同步消息給服務端,服務端收到之后給客戶端回應的時候實際上在服務端是有一個隊列存在的我們稱之為半連接隊列,就在服務端存在著一個連接隊列也就是客戶端發送一個 ??????同步信息過來服務器端要看一下本身的隊列有沒有空位了,才能給客戶端回應,如果服務端的半連接隊列滿了也就是排隊排滿了服務端是沒有能力給客戶端回應的,半連接隊列最多能連多少個達到這個值超了這個值 ??????就接受不了了,也就不能在給客戶端做出響應。 ????查看半連接隊列容量: ??ss?-lnt??|?netstat?-nt ??cat?/proc/sys/net/ipv4/tcp_max_syn_backlog??存放未完成連接隊列的數量,默認128,生產環境中建議調成1024以上; 全連接隊列:全連接隊列就是已經建立了三次握手,握手之后可以建立會話建立連接了,真正處于連接狀態的就是全連接,全連接也是有隊列的,服務端有一定的數量,這個數量在一個范圍內,如果超了這個值就不能在建立連接了 ????????查看全連接隊列: ????cat?/proc/sys/net/core/somaxconn?存放完成連接隊列的數量,默認128,生產環境中建議調成1024以上;
六、TCP的四次揮手
TCP四次揮手的簡單介紹
在客戶端與服務端經過三次握手傳送數據完成后,經過四次揮手斷開連接,那么,是客戶端向服務端請求斷開連接?還是服務端向客戶端請求斷開連接呢?這個是不確定的,通常是客戶端請求斷開連接。但是在有些場景下, 會是服務端請求斷開連接,像如果客戶端在連接后,經過一段時間沒有做任何動作,超過服務器連接時長時,服務器主動會斷開連接!下面拿客戶端主動斷開連接為例: 第一次揮手:在連接狀態下客戶端向服務端發送斷開連接的請求FIN=1(通知服務端我請求關閉連接,標記數據是否發送完畢,如果FIN=1,即告訴對方:"我的數據已經發送完畢,你可以釋放連接了"),seq=u(第一次斷開請求序號),此時 ????????????客戶端進入到FIN-WAIT-1的狀態終止等待服務端確認階段。 第二次揮手:服務端收到FIN=1,seq=u斷開連接請求后,回應客戶端3個報文包ACK=1(確認之前序號有效),seq=v(服務端向客戶端發送自己的序號)ack=u+1(表示客戶端發送的u報文包已經收到下次要發送u+1的報文包也就是u的下一個包) ????????????,但是此時并不是回應確認斷開,只是向客戶端發送我收到你的斷開請求而已,當客戶端收到服務端的第一次回進入到FIN_WAIT_2狀態等待確認階段。 第三次揮手:服務端會檢查數據是否傳完,如有遺留繼續發送,待服務端確認所有數據完成發送之后,因為此前一段時間還是數據傳送階段,所以由服務端向客戶端發起請求斷開連接,服務端再次向客戶端發送4個報文包 ??????FIN=1(告知客戶端以傳送完畢請求斷開連接),ACK=1(再次發送此前收到的序號有效確認客戶端之前的消息已經收到),seq=w(因為數據傳送有時間間隔,所以序號改變),ack=u+1(再次確認客戶端斷開請求已收到), ??????此時服務端進入LAST-ACK?最后確認等待階段。 第四次揮手:客戶端在兩次等待后收到服務端的斷開請求,立即回應給服務端3個報文包ACK=1(確認序號有效),seq=u+1(第二次序號為+1),ack=w+1(確認服務端seq=w收到)。當服務端收到客戶端的回應會立即進入到CLOSED沒有任何連接 ????????????狀態,但是此時客戶端會進入到TIME-WAIT(2MSL)的狀態,MSL(最大數據段的時間長度)這個MSL說的是什么呢,說的就是客戶端和服務端之間發送數據報文時需要多少時間,在TIME-WAIT這個狀態下需要等待2MSL的時間 ????????????才會進入到CLOSED沒有任何連接的狀態,這時才是四次揮手全部完成TCP連接完全斷開
七、TCP有限狀態機FSM:Finite State Machine?
????CLOSED?沒有任何連接狀態? ????LISTEN?偵聽狀態,等待來自遠方TCP端口的連接請求?? ????SYN-SENT?在發送連接請求后,等待對方確認? ????SYN-RECEIVED?在收到和發送一個連接請求后,等待對方確認? ????ESTABLISHED?代表傳輸連接建立,雙方進入數據傳送狀態? ????FIN-WAIT-1?主動關閉,主機已發送關閉連接請求,等待對方確認? ????FIN-WAIT-2?主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求? ????TIME-WAIT?完成雙向傳輸連接關閉,等待所有分組消失? ????CLOSE-WAIT?被動關閉,收到對方發來的關閉連接請求,并已確認? ????LAST-ACK??被動關閉,等待最后一個關閉傳輸連接確認,并等待所有分組消失? ????CLOSING?雙方同時嘗試關閉傳輸連接,等待對方確認
這里添加一個小的實例抓取Linux系統TCP連接不同狀態出現的次數
ss?-nt?|sed?-rn?'1!s/^([^?]+).*/\1/p'?|sort?|uniq?-c
八、UDP特性
工作在傳輸層 提供不可靠的網絡訪問 非面向連接協議 有限的錯誤檢查 傳輸性能高 無數據恢復特性
九、UDP包頭
UDP的包頭結構
源端口:源設備的應用程序端口號; 目的端口:目標設備應用程序的端口號; 報文長度:整個報文大小 校驗和:是提供額外的可靠性; 數據:具體要傳送的數據內容;
十、TCP和UDP的區別
TCP | UDP | |
可靠性 | 可靠 | 不可靠 |
連接性 | 面向連接 | 面向無連接 |
確認機制 | 具有確認機制 | 沒有確認機制,發出去就不管了到不到由網絡說的算 |
效率 | 低(因為TCP需要三次握手建立可靠連接才能進行數據的傳送) | 高 |
數據恢復的能力 | 有 | 沒有 |
流量控制 | 滑動窗口 | 無 |
擁塞機制 | 慢開始、擁塞避免、快重傳、快恢復 | 無 |
傳輸速度 | ?慢 | 快 |
應用場景 | 對效率要求低,對準確度要求高或者要求有連接的場景。比如:電子郵件(SMTP)、萬維網(HTTP)、文件傳輸(FTP) | 對效率要求高,對準確度要求低的場景。比如:域名轉換(DNS)、遠程文件服務器(NFS) |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。