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