IP頭、TCP頭、UDP頭詳解以及定義

一、MAC幀頭定義

/*數據幀定義,頭14個字節,尾4個字節*/
typedef struct _MAC_FRAME_HEADER
{
?char m_cDstMacAddress[6];????//目的mac地址
?char m_cSrcMacAddress[6];????//源mac地址
?short m_cType;???????     //上一層協議類型,如0x0800代表上一層是IP協議,0x0806為arp
}__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER;

?

typedef struct _MAC_FRAME_TAIL
{
?unsigned int m_sCheckSum;????//數據幀尾校驗和
}__attribute__((packed))MAC_FRAME_TAIL, *PMAC_FRAME_TAIL;

?

二、IP頭結構的定義


?

/*IP頭定義,共20個字節*/
typedef struct _IP_HEADER?
{
?char m_cVersionAndHeaderLen;?????  //版本信息(前4位),頭長度(后4位)
?char m_cTypeOfService;??????      // 服務類型8位
?short m_sTotalLenOfPacket;????    //數據包長度
?short m_sPacketID;??????        //數據包標識
?short m_sSliceinfo;??????       ? //分片使用
?char m_cTTL;????????          //存活時間
?char m_cTypeOfProtocol;????      //協議類型
?short m_sCheckSum;??????       //校驗和
?unsigned int m_uiSourIp;?????     //源ip
?unsigned int m_uiDestIp;?????     //目的ip
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;

三、tcp頭結構定義


?

/*TCP頭定義,共20個字節*/
typedef struct _TCP_HEADER?
{
?short m_sSourPort;????????      // 源端口號16bit
?short m_sDestPort;???????      ?// 目的端口號16bit
?unsigned int m_uiSequNum;???????  // 序列號32bit
?unsigned int m_uiAcknowledgeNum;??// 確認號32bit
?short m_sHeaderLenAndFlag;??????  // 前4位:TCP頭長度;中6位:保留;后6位:標志位
?short m_sWindowSize;???????     // 窗口大小16bit
?short m_sCheckSum;????????      // 檢驗和16bit
?short m_surgentPointer;??????     // 緊急數據偏移量16bit
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;


/*TCP頭中的選項定義

kind(8bit)+Length(8bit,整個選項的長度,包含前兩部分)+內容(如果有的話)

KIND = 1表示 無操作NOP,無后面的部分

??2表示 maximum segment?? 后面的LENGTH就是maximum segment選項的長度(以byte為單位,1+1+內容部分長度)

??3表示 windows scale???? 后面的LENGTH就是 windows scale選項的長度(以byte為單位,1+1+內容部分長度)

??4表示 SACK permitted??? LENGTH為2,沒有內容部分

??5表示這是一個SACK包???? LENGTH為2,沒有內容部分

??8表示時間戳,LENGTH為10,含8個字節的時間戳
*/

typedef struct _TCP_OPTIONS
{
?char m_ckind;
?char m_cLength;
?char m_cContext[32];
}__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS;

?

四、UDP頭結構的定義


?

/*UDP頭定義,共8個字節*/

typedef struct _UDP_HEADER?
{
?unsigned short m_usSourPort;????   // 源端口號16bit
?unsigned short m_usDestPort;????   // 目的端口號16bit
?unsigned short m_usLength;????    // 數據包長度16bit
?unsigned short m_usCheckSum;????  // 校驗和16bit
}__attribute__((packed))UDP_HEADER, *PUDP_HEADER;


====

http://www.cnblogs.com/li-hao/archive/2011/12/07/2279912.html

-------------------------------------------------------------------------------------------------------------------------------------?

tcp、ip、udp頭部格式??

2.2 TCP/IP報文格式

  

  1、IP報文格式

  

  IP協議是TCP/IP協議族中最為核心的協議。它提供不可靠、無連接的服務,也即依賴其他層的協議進行差錯控制。在局域網環境,IP協議往往被封裝在以太網幀(見本章1.3節)中傳送。而所有的TCP、UDP、ICMP、IGMP數據都被封裝在IP數據報中傳送。如圖2-3所示:

    

   圖2-3  TCP/IP報文封裝

  

  圖2-4是IP頭部(報頭)格式:(RFC 791)。

  ? 

   圖2-4  IP頭部格式

  

  其中:

  

  ●版本(Version)字段:占4比特。用來表明IP協議實現的版本號,當前一般為IPv4,即0100。

  

  ●報頭長度(Internet Header Length,IHL)字段:占4比特。是頭部占32比特的數字,包括可選項。普通IP數據報(沒有任何選項),該字段的值是5,即160比特=20字節。此字段最大值為60字節。

  

  ●服務類型(Type of Service ,TOS)字段:占8比特。其中前3比特為優先權子字段(Precedence,現已被忽略)。第8比特保留未用。第4至第7比特分別代表延遲、吞吐量、可靠性和花費。當它們取值為1時分別代表要求最小時延、最大吞吐量、最高可靠性和最小費用。這4比特的服務類型中只能置其中1比特為1。可以全為0,若全為0則表示一般服務。服務類型字段聲明了數據報被網絡系統傳輸時可以被怎樣處理。例如:TELNET協議可能要求有最小的延遲,FTP協議(數據)可能要求有最大吞吐量,SNMP協議可能要求有最高可靠性,NNTP(Network News Transfer Protocol,網絡新聞傳輸協議)可能要求最小費用,而ICMP協議可能無特殊要求(4比特全為0)。實際上,大部分主機會忽略這個字段,但一些動態路由協議如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根據這些字段的值進行路由決策。

  

  ●總長度字段:占16比特。指明整個數據報的長度(以字節為單位)。最大長度為65535字節。

  

  ●標志字段:占16比特。用來唯一地標識主機發送的每一份數據報。通常每發一份報文,它的值會加1。

  

  ●標志位字段:占3比特。標志一份數據報是否要求分段。

  

  ●段偏移字段:占13比特。如果一份數據報要求分段的話,此字段指明該段偏移距原始數據報開始的位置。

  

  ●生存期(TTL:Time to Live)字段:占8比特。用來設置數據報最多可以經過的路由器數。由發送數據的源主機設置,通常為32、64、128等。每經過一個路由器,其值減1,直到0時該數據報被丟棄。

  

  ●協議字段:占8比特。指明IP層所封裝的上層協議類型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。

  

  ●頭部校驗和字段:占16比特。內容是根據IP頭部計算得到的校驗和碼。計算方法是:對頭部中每個16比特進行二進制反碼求和。(和ICMP、IGMP、TCP、UDP不同,IP不對頭部后的數據進行校驗)。

  

  ●源IP地址、目標IP地址字段:各占32比特。用來標明發送IP數據報文的源主機地址和接收IP報文的目標主機地址。

  

  可選項字段:占32比特。用來定義一些任選項:如記錄路徑、時間戳等。這些選項很少被使用,同時并不是所有主機和路由器都支持這些選項。可選項字段的長度必須是32比特的整數倍,如果不足,必須填充0以達到此長度要求。

  

  2、TCP數據段格式

  

  TCP是一種可靠的、面向連接的字節流服務。源主機在傳送數據前需要先和目標主機建立連接。然后,在此連接上,被編號的數據段按序收發。同時,要求對每個數據段進行確認,保證了可靠性。如果在指定的時間內沒有收到目標主機對所發數據段的確認,源主機將再次發送該數據段。

  

  如圖2-5所示,是TCP頭部結構(RFC 793、1323)。

    

   圖2-5  TCP頭部結構

  

  ●源、目標端口號字段:占16比特。TCP協議通過使用"端口"來標識源端和目標端的應用進程。端口號可以使用0到65535之間的任何數字。在收到服務請求時,操作系統動態地為客戶端的應用程序分配端口號。在服務器端,每種服務在"眾所周知的端口"(Well-Know Port)為用戶提供服務。

  

  ●順序號字段:占32比特。用來標識從TCP源端向TCP目標端發送的數據字節流,它表示在這個報文段中的第一個數據字節。

  

  ●確認號字段:占32比特。只有ACK標志為1時,確認號字段才有效。它包含目標端所期望收到源端的下一個數據字節。

  

  ●頭部長度字段:占4比特。給出頭部占32比特的數目。沒有任何選項字段的TCP頭部長度為20字節;最多可以有60字節的TCP頭部。

  

  ●標志位字段(U、A、P、R、S、F):占6比特。各比特的含義如下:

  

  ◆URG:緊急指針(urgent pointer)有效。

  

  ◆ACK:確認序號有效。

  

  ◆PSH:接收方應該盡快將這個報文段交給應用層。

  

  ◆RST:重建連接。

  

  ◆SYN:發起一個連接。

  

  ◆FIN:釋放一個連接。

  

  ●窗口大小字段:占16比特。此字段用來進行流量控制。單位為字節數,這個值是本機期望一次接收的字節數。

  

  ●TCP校驗和字段:占16比特。對整個TCP報文段,即TCP頭部和TCP數據進行校驗和計算,并由目標端進行驗證。

  

  ●緊急指針字段:占16比特。它是一個偏移量,和序號字段中的值相加表示緊急數據最后一個字節的序號。

  

  ●選項字段:占32比特。可能包括"窗口擴大因子"、"時間戳"等選項。

  

  3、UDP數據段格式

  

  UDP是一種不可靠的、無連接的數據報服務。源主機在傳送數據前不需要和目標主機建立連接。數據被冠以源、目標端口號等UDP報頭字段后直接發往目的主機。這時,每個數據段的可靠性依靠上層協議來保證。在傳送數據較少、較小的情況下,UDP比TCP更加高效。

  

  如圖2-6所示,是UDP頭部結構(RFC 793、1323):

    

   圖2-6  UDP數據段格式

  

  ●源、目標端口號字段:占16比特。作用與TCP數據段中的端口號字段相同,用來標識源端和目標端的應用進程。

  

  ●長度字段:占16比特。標明UDP頭部和UDP數據的總長度字節。

  

  ●校驗和字段:占16比特。用來對UDP頭部和UDP數據進行校驗。和TCP不同的是,對UDP來說,此字段是可選項,而TCP數據段中的校驗和字段是必須有的。

  

  2.3 套接字

  

  在每個TCP、UDP數據段中都包含源端口和目標端口字段。有時,我們把一個IP地址和一個端口號合稱為一個套接字(Socket),而一個套接字對(Socket pair)可以唯一地確定互連網絡中每個TCP連接的雙方(客戶IP地址、客戶端口號、服務器IP地址、服務器端口號)。

  

  如圖2-7所示,是常見的一些協議和它們對應的服務端口號。

    

   圖2-7  常見協議和對應的端口號

  

  需要注意的是,不同的應用層協議可能基于不同的傳輸層協議,如FTP、TELNET、SMTP協議基于可靠的TCP協議。TFTP、SNMP、RIP基于不可靠的UDP協議。

  

  同時,有些應用層協議占用了兩個不同的端口號,如FTP的20、21端口,SNMP的161、162端口。這些應用層協議在不同的端口提供不同的功能。如FTP的21端口用來偵聽用戶的連接請求,而20端口用來傳送用戶的文件數據。再如,SNMP的161端口用于SNMP管理進程獲取SNMP代理的數據,而162端口用于SNMP代理主動向SNMP管理進程發送數據。

  

  還有一些協議使用了傳輸層的不同協議提供的服務。如DNS協議同時使用了TCP 53端口和UDP 53端口。DNS協議在UDP的53端口提供域名解析服務,在TCP的53端口提供DNS區域文件傳輸服務。

  

  2.4 TCP連接建立、釋放時的握手過程

  

  1、TCP建立連接的三次握手過程

  

  TCP會話通過三次握手來初始化。三次握手的目標是使數據段的發送和接收同步。同時也向其他主機表明其一次可接收的數據量(窗口大小),并建立邏輯連接。這三次握手的過程可以簡述如下:

  

  ●源主機發送一個同步標志位(SYN)置1的TCP數據段。此段中同時標明初始序號(Initial Sequence Number,ISN)。ISN是一個隨時間變化的隨機值。

  

  ●目標主機發回確認數據段,此段中的同步標志位(SYN)同樣被置1,且確認標志位(ACK)也置1,同時在確認序號字段表明目標主機期待收到源主機下一個數據段的序號(即表明前一個數據段已收到并且沒有錯誤)。此外,此段中還包含目標主機的段初始序號。

  

  ●源主機再回送一個數據段,同樣帶有遞增的發送序號和確認序號。

  

  至此為止,TCP會話的三次握手完成。接下來,源主機和目標主機可以互相收發數據。整個過程可用圖2-8表示。

    

   圖2-8  TCP建立連接的三次握手過程

  

  2、TCP釋放連接的四次握手過程

  

  TCP連接的釋放需要進行四次握手,步驟是:

  

  ●源主機發送一個釋放連接標志位(FIN)為1的數據段發出結束會話請求

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255128.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于iOS 3D touch 指紋驗證的隨筆

file:///Users/OWen/Desktop/3DTouch.png 隨著iOS系統不斷的更新迭代,蘋果總會推出一些新的功能,今天就研究了一下iOS8之后推出的指紋驗證的功能,然后寫了一個小demo,與君分享。。 上demo: 1:首先導入一個…

HALCON示例程序inner_rectangle1.hdev木板有效區域提取

HALCON示例程序inner_rectangle1.hdev木板有效區域提取 示例程序源碼(加注釋) 關于顯示類函數解釋 dev_update_window (‘off’) dev_update_var (‘off’) dev_update_pc (‘off’) read_image (Image, ‘wood_knots’) get_image_size (Image, Width…

vsCode ext install 不工作

vsCode 擴展商店 不可用 ext 不可用 ext install eamodio.gitlens 1、搜索離線插件https://marketplace.visualstudio.com/vscode 2、插件離線插件模板https://marketplace.gallery.vsassets.io/_apis/public/gallery/publisher/marketplace/extension/${extension name}/${ver…

遞歸實現 十進制轉換其他進制(2-16)

1 def to_str(n, base): 2 convert_string "0123456789ABCDEF" 3 if n < base: 4 return convert_string[n] 5 else: 6 return to_str(n / base, base) convert_string[n % base] 7 8 print to_str(168, 8) 轉載于:https://www.cn…

在UltraEdit的查找和替換中使用正則表達式 (轉)

很多朋友都用過或者正在用UltraEdit&#xff0c;這個編輯器陪伴我也好幾年了&#xff0c;從很多地方影響著我寫代碼的快捷鍵習慣&#xff0c;Ultraedit提供了非常豐富的編輯功能&#xff0c;其中非常重要的查找和替換功能一定大家都用過&#xff0c;Ultraedit提供的查找替換功能…

基本 TCP 套接字編程講解

基于 TCP 的套接字編程的所有客戶端和服務器端都是從調用socket 開始&#xff0c;它返回一個套接字描述符。客戶端隨后調用connect 函數&#xff0c;服務器端則調用 bind、listen 和accept 函數。 使用套接口客戶機服務器的的例子 sever.c #include <stdio.h> #include &…

HALCON示例程序inspect_bga.hdev測量bga焊點缺陷

HALCON示例程序inspect_bga.hdev測量bga焊點缺陷 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 read_image (Image, ‘bga_14x14_model’) get_image_pointer1 (Image, Pointer, Type, Width, Height) dev_update_off () dev_close_window () dev_open_win…

怎樣屏蔽微信朋友圈視頻?局域網如何禁止員工看朋友圈視頻?

上班時間刷刷朋友圈&#xff0c;一眨眼半小時就過去了。不但會影響工作效率&#xff0c;而且朋友圈的視頻會占用大量的帶寬。所以對企業管理人員來說&#xff0c;很多時候需要禁止員工在工作時段刷朋友圈。但是行政手段要和技術手段配合&#xff0c;才可以發揮真正的作用。本文…

cf414B(dp)

題目鏈接&#xff1a;http://codeforces.com/problemset/problem/414/B 題意&#xff1a;定義所有元素是其前一個元素的倍數的數列為good sequence&#xff0c;給出 n, 和 k&#xff0c;求1....n組成的長度為k的good sequence 的數目&#xff1b; 思路&#xff1a;dp 用dp[i][j…

安裝IIS

安裝IIS過程中我們需要很多系統文件,這個時候我們就要下載一個非GHOST版本的系統安裝文件就可以了, 雨林木風安裝版8.0 http://dx.lwkb.com/setup/YlmF_XPSP3_YS8.0F/YlmF_XPSP3_YS8.0F.iso 這個不錯 轉載于:https://www.cnblogs.com/toSeeMyDream/p/5574884.html

深入理解C++的動態綁定和靜態綁定

為了支持c的多態性&#xff0c;才用了動態綁定和靜態綁定。理解他們的區別有助于更好的理解多態性&#xff0c;以及在編程的過程中避免犯錯誤。需要理解四個名詞&#xff1a;1、對象的靜態類型&#xff1a;對象在聲明時采用的類型。是在編譯期確定的。2、對象的動態類型&#x…

增量值編碼器、單圈絕對值編碼器、多圈絕對值編碼器

主流的伺服電機位置反饋元件包括增量值編碼器&#xff0c;單圈絕對值編碼器&#xff0c;多圈絕對值編碼器&#xff0c;旋轉變壓器等。下面分別介紹&#xff1a; 增量值編碼器增量式編碼器是將位移轉換成周期性的電信號&#xff0c;再把這個電信號轉變成計數脈沖&#xff0c;用…

HALCON示例程序inspect_bottle_mouth.hdev玻璃瓶口缺陷檢測

HALCON示例程序inspect_bottle_mouth.hdev玻璃瓶口缺陷檢測 示例程序源碼&#xff08;加注釋&#xff09; 定義變量并初始化 SmoothX : 501 ThresholdOffset : 25 MinDefectSize : 50 PolarResolution : 640 RingSize : 70 get_system (‘store_empty_region’, StoreEmptyReg…

靜態主席樹總結(靜態區間的k大)

靜態主席樹總結(靜態區間的&#xff4b;大) 首先我們先來看一道題 給定N個正整數構成的序列&#xff0c;將對于指定的閉區間查詢其區間內的第K小值。 輸入格式&#xff1a; 第一行包含兩個正整數N、M&#xff0c;分別表示序列的長度和查詢的個數。 第二行包含N個正整數&a…

Java中MySQL事務處理舉例

實例&#xff08;以sql語句中的insert語句為例&#xff09; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;/*** 事務的基本用法**/ …

永磁交流伺服電機的工作原理與更換新編碼器后的常規零位校正方法

http://wuhuotun.blog.163.com/blog/static/73085450200910655748516/ 永磁交流伺服電機的編碼器相位為何要與轉子磁極相位對齊 其唯一目的就是要達成矢量控制的目標&#xff0c;使d軸勵磁分量和q軸出力分量解耦&#xff0c;令永磁交流伺服電機定子繞組產生的電磁場始終正交于…

理解Java中字符流與字節流的區別

1. 什么是流 Java中的流是對字節序列的抽象&#xff0c;我們可以想象有一個水管&#xff0c;只不過現在流動在水管中的不再是水&#xff0c;而是字節序列。和水流一樣&#xff0c;Java中的流也具有一個“流動的方向”&#xff0c;通常可以從中讀入一個字節序列的對象被稱為輸入…

HALCON示例程序inspect_solar_fingers.hdev太陽能電池板電路缺陷檢測

HALCON示例程序inspect_solar_fingers.hdev太陽能電池板電路缺陷檢測 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () dev_close_window () ImageName : ‘solar_cell/solar_cell_’ read_image (Image, ImageName ‘01’) dev_open_win…

C++多線程 例子

C多線程 例子2008-08-21 15:11//這是2個線程模擬賣火車票的小程序#include <windows.h>#include <iostream.h>DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread dataDWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread dataintindex0;inttickets10;HANDLE hM…

2018/03/25

2019獨角獸企業重金招聘Python工程師標準>>> March 25 2018 Sunday Weather&#xff1a;cloudy 1、需求&#xff1a; a0.5 b3 ca*b 求c的值&#xff1a; [rootDasoncheng sbin]# cat a.sh #!/bin/bash a0.5 b3 cecho $a*$b |bc echo $canswer referred&#xff1a;…