溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

TCP/IP協(xié)議棧介紹

發(fā)布時(shí)間:2020-06-06 08:41:37 來(lái)源:網(wǎng)絡(luò) 閱讀:320 作者:huai251459 欄目:系統(tǒng)運(yùn)維

一、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協(xié)議棧介紹

二、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)

TCP/IP協(xié)議棧介紹

常見(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/IP協(xié)議棧介紹

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/IP協(xié)議棧介紹

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ì)列:

TCP/IP協(xié)議棧介紹

半連接隊(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/IP協(xié)議棧介紹

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包頭

TCP/IP協(xié)議棧介紹

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ū)別


TCPUDP
可靠性
可靠不可靠
連接性面向連接面向無(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)


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI