關(guān)于TCP和UDP的服務(wù)器和客戶端的執(zhí)行步驟

轉(zhuǎn)載
原文:關(guān)于TCP和UDP的服務(wù)器和客戶端的執(zhí)行步驟
TCP和UDP的最完整的區(qū)別

TCP

TCP編程的服務(wù)器端一般步驟是:
1、創(chuàng)建一個socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
4、開啟監(jiān)聽,用函數(shù)listen();
5、接收客戶端上來的連接,用函數(shù)accept();
6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接;
8、關(guān)閉監(jiān)聽;

TCP編程的客戶端一般步驟是:
1、創(chuàng)建一個socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
4、設(shè)置要連接的對方的IP地址和端口等屬性;
5、連接服務(wù)器,用函數(shù)connect();
6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接;

UDP

UDP編程的服務(wù)器端一般步驟是:
1、創(chuàng)建一個socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
4、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();
5、關(guān)閉網(wǎng)絡(luò)連接;

UDP編程的客戶端一般步驟是:
1、創(chuàng)建一個socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
4、設(shè)置對方的IP地址和端口等屬性;
5、發(fā)送數(shù)據(jù),用函數(shù)sendto();
6、關(guān)閉網(wǎng)絡(luò)連接;

參考:TCP服務(wù)器和客戶端交互

TCP客戶/服務(wù)器的套接字函數(shù)

1、socket函數(shù):為了執(zhí)行網(wǎng)絡(luò)輸入輸出,一個進程必須做的第一件事就是調(diào)用socket函數(shù)獲得一個文件描述符。
2、connect函數(shù):當(dāng)用socket建立了套接口后,可以調(diào)用connect為這個套接字指明遠程端的地址;如果是字節(jié)流套接口,connect就使用Tcp三次握手建立一個連接;如果是Udp數(shù)據(jù)報套接口,connect僅指明遠程端地址,而不向它發(fā)送任何數(shù)據(jù)。
3、bind函數(shù):為套接口分配一個本地IP和協(xié)議端口,對于網(wǎng)際協(xié)議,協(xié)議地址是32位IPv4地址或128位IPv6地址與16位的TCP或UDP端口號的組合;如指定端口為0,調(diào)用bind時內(nèi)核將選擇一個臨時端口,如果指定一個通配IP地址,則要等到建立連接后內(nèi)核才選擇一個本地IP地址。
4、listen函數(shù):listen函數(shù)僅被TCP服務(wù)器調(diào)用,它的作用是將用sock創(chuàng)建的主動套接口轉(zhuǎn)換成被動套接口,并等待來自客戶端的連接請求。
5、accept函數(shù):accept函數(shù)由TCP服務(wù)器調(diào)用,從已完成連接隊列頭返回一個已完成連接,如果完成連接隊列為空,則進程進入睡眠狀態(tài)。
6、write和read函數(shù):當(dāng)服務(wù)器和客戶端的連接建立起來后,就可以進行數(shù)據(jù)傳輸了,服務(wù)器和客戶端用各自的套接字描述符進行讀/寫操作。因為套接字描述符也是一種文件描述符,所以可以用文件讀/寫函數(shù)write()和read()進行接收和發(fā)送操作。
(1)write()函數(shù)用于數(shù)據(jù)的發(fā)送。
(2)read()函數(shù)用于數(shù)據(jù)的接收。
7、send和recv函數(shù):TCP套接字提供了send()和recv()函數(shù),用來發(fā)送和接收操作。這兩個函數(shù)與write()和read()函數(shù)很相似,只是多了一個附加的參數(shù)。
(1)send()函數(shù)用于數(shù)據(jù)的發(fā)送。
(2)recv()函數(shù)用于數(shù)據(jù)的發(fā)送。

TCP與UDP區(qū)別總結(jié):

1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2、TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達;UDP盡最大努力交付,即不保 證可靠交付
3、TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向數(shù)據(jù)包報文的
UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應(yīng)用很有用,如IP電話,實時視頻會議等)
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個字節(jié)
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

補充:
TCP充分實現(xiàn)了數(shù)據(jù)傳輸時各種控制功能,可以進行丟包的重發(fā)控制,還可以對次序亂掉的分包進行順序控制。而這些在UDP中都沒有。此外,TCP作為一種面向有連接的協(xié)議,只有在確認通信對端存在時才會發(fā)送數(shù)據(jù),從而可以控制通信流量的浪費。TCP通過檢驗和、序列號、確認應(yīng)答、重發(fā)控制、連接管理以及窗口控制等機制實現(xiàn)可靠性傳輸。
UDP不提供復(fù)雜的控制機制,利用IP提供面向無連接的通信服務(wù)。UDP也無法進行流量控制等避免網(wǎng)絡(luò)擁塞的行為。無法重發(fā)和保證順序。

例題

TCP建立連接的過程采用三次握手,已知第三次握手報文的發(fā)送序列號為1000,確認序列號為2000,請問第二次握手報文的發(fā)送序列號和確認序列號分別為
解析:
發(fā)送序列是自己發(fā)送報文的序列號,當(dāng)前發(fā)送序列號是上一次發(fā)送序列號+1
確認序列號是從對方接收到的發(fā)送序列號+1

第三次握手發(fā)送的序列號是1000,那說明第一次握手發(fā)送的序列號是999,注意:這里是握手,因此,第二次握手的確認序列號是1000,即確認序列號是從對方接收到的發(fā)送序列號+1。
第三次握手發(fā)送的確認號是2000,說明第二次握手的發(fā)送序列號是1999。

客戶端:發(fā)送X
服務(wù)端:發(fā)送Y, 確認X+1
客戶端:發(fā)送X+1(1000),確認Y+1(2000)

TCP數(shù)據(jù)格式

TCP會把應(yīng)用進程傳來的字節(jié)流數(shù)據(jù)切割成許多個數(shù)據(jù)包,在網(wǎng)絡(luò)上發(fā)送。IP包是會失去順序或者產(chǎn)生重復(fù)的,TCP協(xié)議要能還原到字節(jié)流本來面目。


TCP數(shù)據(jù)格式

標(biāo)志位共有六個,其中RST位就在TCP異常時出現(xiàn)

三次握手

三次握手

為了能夠說清楚下面的RST攻擊,需要結(jié)合上圖說說:SYN標(biāo)志位、序號、滑動窗口大小。

建立連接的請求中,標(biāo)志位SYN都要置為1,在這種請求中會告知MSS段大小,就是本機希望接收TCP包的最大大小。

發(fā)送的數(shù)據(jù)TCP包都有一個序號。它是這么得來的:最初發(fā)送SYN時,有一個初始序號,根據(jù)RFC的定義,各個操作系統(tǒng)的實現(xiàn)都是與系統(tǒng)時間相關(guān)的。之后,序號的值會不斷的增加,比如原來的序號是100,如果這個TCP包的數(shù)據(jù)有10個字節(jié),那么下次的TCP包序號會變成110。

滑動窗口用于加速傳輸,比如發(fā)了一個seq=100的包,理應(yīng)收到這個包的確認ack=101后再繼續(xù)發(fā)下一個包,但有了滑動窗口,只要新包的seq與沒有得到確認的最小seq之差小于滑動窗口大小,就可以繼續(xù)發(fā)。

3、滑動窗口

滑動窗口毫無疑問是用來加速數(shù)據(jù)傳輸?shù)摹CP要保證“可靠”,就需要對一個數(shù)據(jù)包進行ack確認表示接收端收到。有了滑動窗口,接收端就可以等收到許多包后只發(fā)一個ack包,確認之前已經(jīng)收到過的多個數(shù)據(jù)包。有了滑動窗口,發(fā)送端在發(fā)送完一個數(shù)據(jù)包后不用等待它的ack,在滑動窗口大小內(nèi)可以繼續(xù)發(fā)送其他數(shù)據(jù)包。

四次握手

四次握手

FIN標(biāo)志位也看到了,它用來表示正常關(guān)閉連接。圖的左邊是主動關(guān)閉連接方,右邊是被動關(guān)閉連接方,用netstat命令可以看到標(biāo)出的連接狀態(tài)。

FIN是正常關(guān)閉,它會根據(jù)緩沖區(qū)的順序來發(fā)的,就是說緩沖區(qū)FIN之前的包都發(fā)出去后再發(fā)FIN包,這與RST不同。

RST標(biāo)志位

RST表示復(fù)位,用來異常的關(guān)閉連接,在TCP的設(shè)計中它是不可或缺的。就像上面說的一樣,發(fā)送RST包關(guān)閉連接時,不必等緩沖區(qū)的包都發(fā)出去(不像上面的FIN包),直接就丟棄緩存區(qū)的包發(fā)送RST包。而接收端收到RST包后,也不必發(fā)送ACK包來確認。

TCP處理程序會在自己認為的異常時刻發(fā)送RST包。例如,A向B發(fā)起連接,但B之上并未監(jiān)聽相應(yīng)的端口,這時B操作系統(tǒng)上的TCP處理程序會發(fā)RST包。

又比如,AB正常建立連接了,正在通訊時,A向B發(fā)送了FIN包要求關(guān)連接,B發(fā)送ACK后,網(wǎng)斷了,A通過若干原因放棄了這個連接(例如進程重啟)。網(wǎng)通了后,B又開始發(fā)數(shù)據(jù)包,A收到后表示壓力很大,不知道這野連接哪來的,就發(fā)了個RST包強制把連接關(guān)了,B收到后會出現(xiàn)connect reset by peer錯誤。

6、RST攻擊

A和服務(wù)器B之間建立了TCP連接,此時C偽造了一個TCP包發(fā)給B,使B異常的斷開了與A之間的TCP連接,就是RST攻擊了。實際上從上面RST標(biāo)志位的功能已經(jīng)可以看出這種攻擊如何達到效果了。

那么偽造什么樣的TCP包可以達成目的呢?我們至頂向下的看。

假定C偽裝成A發(fā)過去的包,這個包如果是RST包的話,毫無疑問,B將會丟棄與A的緩沖區(qū)上所有數(shù)據(jù),強制關(guān)掉連接。

如果發(fā)過去的包是SYN包,那么,B會表示A已經(jīng)發(fā)瘋了(與OS的實現(xiàn)有關(guān)),正常連接時又來建新連接,B主動向A發(fā)個RST包,并在自己這端強制關(guān)掉連接。

這兩種方式都能夠達到復(fù)位攻擊的效果。似乎挺恐怖,然而關(guān)鍵是,如何能偽造成A發(fā)給B的包呢?這里有兩個關(guān)鍵因素,源端口和序列號。

一個TCP連接都是四元組,由源IP、源端口、目標(biāo)IP、目標(biāo)端口唯一確定一個連接。所以,如果C要偽造A發(fā)給B的包,要在上面提到的IP頭和TCP頭,把源IP、源端口、目標(biāo)IP、目標(biāo)端口都填對。這里B作為服務(wù)器,IP和端口是公開的,A是我們要下手的目標(biāo),IP當(dāng)然知道,但A的源端口就不清楚了,因為這可能是A隨機生成的。當(dāng)然,如果能夠?qū)ΤR姷腛S如windows和linux找出生成source port規(guī)律的話,還是可以搞定的。

序列號問題是與滑動窗口對應(yīng)的,偽造的TCP包里需要填序列號,如果序列號的值不在A之前向B發(fā)送時B的滑動窗口內(nèi),B是會主動丟棄的。所以我們要找到能落到當(dāng)時的AB間滑動窗口的序列號。這個可以暴力解決,因為一個sequence長度是32位,取值范圍0-4294967296,如果窗口大小像上圖中我抓到的windows下的65535的話,只需要相除,就知道最多只需要發(fā)65537(4294967296/65535=65537)個包就能有一個序列號落到滑動窗口內(nèi)。RST包是很小的,IP頭+TCP頭也才40字節(jié),算算我們的帶寬就知道這實在只需要幾秒鐘就能搞定。

那么,序列號不是問題,源端口會麻煩點,如果各個操作系統(tǒng)不能完全隨機的生成源端口,或者黑客們能通過其他方式獲取到source port,RST攻擊易如反掌,后果很嚴(yán)重

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)、lso...
    北辰青閱讀 9,702評論 0 11
  • 序言TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基...
    Little_Shaun閱讀 407評論 0 0
  • 1.這篇文章不是本人原創(chuàng)的,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,340評論 6 174
  • 個人認為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,185評論 0 8
  • 十幾年前大家討論著到縣城買房子。因為城里方便,可享受各種一站式服務(wù)。同事小王說,如果有閑錢,就回山里的老家...
    湖溪釣翁閱讀 583評論 0 4

友情鏈接更多精彩內(nèi)容