資源描述:
《TCP&IP協(xié)議簡單分析》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、TCP/IP協(xié)議簡單分析關鍵字:tcpip首先TCP和IP是兩種不同的協(xié)議,它們來七層網(wǎng)絡模型中分別在不同的層次,IP協(xié)議是網(wǎng)絡層的協(xié)議,TCP是更高一層的傳輸層的協(xié)議,TCP是建立在IP協(xié)議之上的,所以一般把TCP和IP連在一起說TCP/IP協(xié)議。Windows系統(tǒng)的TCP協(xié)議棧的數(shù)據(jù)包默認是1460字節(jié)大小,如果一次傳輸?shù)臄?shù)據(jù)大于這個長度,會把分割成幾個長度都不大于1460字節(jié)的TCP數(shù)據(jù)包,每個數(shù)據(jù)包都會被賦予一個sequncenumber(相當于每個數(shù)據(jù)包的順序號,憑這個接收端可以知道數(shù)據(jù)包的前后順序)之后TCP的數(shù)據(jù)包再被包裹上一
2、層IP的數(shù)據(jù)的頭,形成IP數(shù)據(jù)包在網(wǎng)上傳輸(其實最后還要包一層以太網(wǎng)數(shù)據(jù)包,網(wǎng)絡上最終傳輸?shù)亩际且蕴W(wǎng)數(shù)據(jù)包)。IP數(shù)據(jù)包到了目的地后,接收端首先把IP數(shù)據(jù)包的包頭去掉,取出TCP的包。接收端每收到一個TCP的數(shù)據(jù)包都需要返回給發(fā)送端一個ACK的數(shù)據(jù)包告訴發(fā)送端已接到此數(shù)據(jù)包,如果接收端在一定的時間內沒有收到某個數(shù)據(jù)包的ACK響應,會再次發(fā)送這個數(shù)據(jù)包,這樣就保證了數(shù)據(jù)都能被接收端接收到(因特網(wǎng)上丟數(shù)據(jù)包是很正常的事,如果沒有數(shù)據(jù)包重發(fā)機制,很難保證發(fā)送的數(shù)據(jù)都能被接收端完整的收到)。每個TCP數(shù)據(jù)包也是由包頭和實際數(shù)據(jù)組成,包頭包含如下主
3、要內容:l????????Sourceport(2字節(jié))發(fā)送端的端口號l????????Destinationport(2字節(jié))接收端的端口號TCP包頭中只包含雙方的端口號,雙方的IP地址在IP包的包頭,所以在TCP數(shù)據(jù)包的包頭中沒有IP地址。l????????Sequencenumber(4字節(jié))數(shù)據(jù)的順序號,表示當前數(shù)據(jù)包中的數(shù)據(jù)起始順序號,比如前一個數(shù)據(jù)包的SEQ為十六進制的:dfd5aa3d,數(shù)據(jù)包的實際數(shù)據(jù)長度為16字節(jié),那么下一個數(shù)據(jù)包的SEQ就要在前一個數(shù)據(jù)包的SEQ基礎上加上16,為:dfd5aa4dl????????Ack
4、nowledgementnumber(4字節(jié))接收到對方的某個數(shù)據(jù)包后的回應順序號。如果接收到了對方主動發(fā)送來的某個數(shù)據(jù)包,必須要返回對方一個ACK回應數(shù)據(jù)包,數(shù)據(jù)包的頭部的Acknowledgementnumber部分根據(jù)對方發(fā)送數(shù)據(jù)的SEQ和實際數(shù)據(jù)長度,返回SEQ+實際數(shù)據(jù)長度,表示已經(jīng)接收到這個數(shù)據(jù)包。對方收到這個回應,根據(jù)數(shù)值計算后知道這個數(shù)據(jù)包已經(jīng)被對方接收。如果接收不到ACK的回應,就意味著這個數(shù)據(jù)包已經(jīng)在網(wǎng)上被丟失,需要重新發(fā)送此數(shù)據(jù)包。l????????Headerlength(1字節(jié))表示TCP數(shù)據(jù)包的包頭長度,整個TC
5、P數(shù)據(jù)包的長度減包頭長度就能得到TCP數(shù)據(jù)包的實際傳送的數(shù)據(jù)長度。l????????Flags(1字節(jié))標志字節(jié),每一位都是一個標志,以下是幾個主要標志:ACK–表示數(shù)據(jù)包是個ACK回應數(shù)據(jù)包,表示接收到了對方的某個數(shù)據(jù)包,具體哪個包由包頭的Acknowledgementnumber部分指示。PSH–表示這是個有實際數(shù)據(jù)的包。SYN–表示這是個建立連接的數(shù)據(jù)包,通訊雙方要通訊,總是由客戶端先發(fā)送SYN數(shù)據(jù)包到服務端以建立TCP的連接。FIN–表示通訊結束,拆除連接的數(shù)據(jù)包。下面描述一次TCP傳送數(shù)據(jù)的完整過程,以一個客戶端向服務端發(fā)送一些數(shù)
6、據(jù)為例。Figure1.一次完整的TCP通訊的過程1、建立連接TCP是面向連接的協(xié)議,客戶端和服務端要通訊就必須先建立一個連接。首先通訊雙方都有地址,就是IP地址加端口號(IP:Port)標識通訊的每一端,客戶端的IP:Port跟服務器IP:Port之間就構成一個socket套接字。所謂建立連接就是在客戶端的IP:Port跟服務器IP:Port之間建立一個通道,初始化一些通訊的基礎設置,以便以后的數(shù)據(jù)通訊的正常進行。1.1.???客戶端發(fā)送SYN總是客戶端發(fā)起連接,首先客戶端發(fā)送SYN數(shù)據(jù)包到服務端以建立TCP連接。SYN數(shù)據(jù)包只有TCP包
7、頭,沒有實際數(shù)據(jù)。Flags標志字節(jié)的SYN位置位,表示是SYN數(shù)據(jù)包。Sequencenumber由客戶端隨機生成一個4字節(jié)的數(shù)據(jù),作為本次連接通訊客戶端數(shù)據(jù)的起始順序號,以后客戶端發(fā)往服務端的數(shù)據(jù)包的Sequencenumber都在此基礎上加上每次傳送的實際數(shù)據(jù)長度依次相加遞增,這樣根據(jù)每個數(shù)據(jù)包的Sequencenumber就能判斷出數(shù)據(jù)包的前后順序,以便接收方根據(jù)數(shù)據(jù)包的順序拼接數(shù)據(jù)包。1.2.???服務端回應ACK、SYN服務端收到客戶端的SYN后,首先要發(fā)送一個ACK數(shù)據(jù)包給客戶端表示收到了這個數(shù)據(jù)包。數(shù)據(jù)包的Flags標志字節(jié)
8、的ACK置位,表示是ACK回應數(shù)據(jù)包。Acknowledgementnumber設置為接收到的數(shù)據(jù)包的SEQ+數(shù)據(jù)包實際長度,因為接收到的SYN的實際數(shù)據(jù)長度為0,但是TCP協(xié)議