帧头,TCP,UDP,IP头部(ARP协议)

来源:互联网 发布:linux informix 卸载 编辑:程序博客网 时间:2024/06/05 17:16
  • 首先先介绍MAC中帧头:
帧头,TCP,UDP,IP头部(ARP协议)

接下来是IP头部。
帧头,TCP,UDP,IP头部(ARP协议)

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;             //校验和(用来检查IP的头部)
 unsigned int m_uiSourIp;          //源ip
 unsigned int m_uiDestIp;          //目的ip    以上源IP和目的IP基本上是不会变的,除非使用NAT技术。
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;

  • 接下来是TCP的头部。
因为TCP是面向连接的有确认的协议,所以需要一些序号,确认序号,窗口等字段。

帧头,TCP,UDP,IP头部(ARP协议)
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,表示想收到的每个TCP数据段的大小。
 short m_sCheckSum;              // 检验和16bit (根据内容计算的,要与IP头部中的校验和区别出来)
 short m_surgentPointer;           // 紧急数据偏移量16bit
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;

PSH:立即传输,不允许有延迟等待(为了不浪费网络资源,当需要发送ACK确认的时候,将延迟等待有数据的数据包,捎带确认。)。

  • 接下来是UDP头部。
因为UDP是不面向连接的,所以不需要有窗口大小,序号等字段。只需要有简单的端口号与数据以及检查字段。

帧头,TCP,UDP,IP头部(ARP协议)
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;


注意:
  • 为什么ip头部中是有目标ip地址,而TCP和UDP中只有目标端口?
首先先明白两个定义:
  1. TSAP:Transport Service Access Point传输服务访问点。(传输层的端口)
  2. NSAP:Network Service Access Point网络服务访问点。(网络层的IP)
应用进程可以将自己关联到一个本地的TSAP上,以便与一个远程TSAP建立连接,这些连接运行在每台主机的NSAP上,在有些网络上,每台计算机只有一个NSAP,但是可以有多个传输端点共享此NSAP,因此需要某种方法来区分这些传输节点。所以在IP的头部只需要说明IP地址,但是在TCP或者UDP中需要说明端口。

  • 在上层传输都是通过ip地址来传,但是在数据链路层都是根据MAC地址来传输的,那么如何从ip地址转换到MAC地址的呢?
这就是要使用到ARP协议了。ARP(Address Resolution Protocol)地址解析协议,根据IP地址来取得物理MAC地址的一个TCP/IP协议。
下面用一个流程来说明ARP的流程。
主机A:192.168.1.1                MAC_A:OA-11-22-33-44-01
主机B:192.168.1.2                MAC_B:OA-11-22-33-44-02
当主机A需要与主机B通信时,ARP可以将主机B的IP地址解析成主机B的MAC地址。
  1. 根据主机A上的路由表内容,IP用于确定访问主机B的转发IP地址是192.168.1.2.然后主机A在自己本地的ARP缓存中检查B的匹配MAC地址。
  2. 若找不到,则它将询问192.168.1.2的硬件地址。所以主机A会发送ARP请求帧广播到本地网络上的所有主机,A的ip地址和MAC地址都包括在该ARP请求中,本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP匹配,若不匹配则丢弃ARP请求。
  3. 主机B确定ARP请求中的ip与自己的ip匹配,则将A的ip与mac地址映射添加到自己本地的ARP中。
  4. 主机B将包含MAC地址的ARP回复消息直接发送给A。
  5. A收到B发来的ARP回复消息时,会用主机B的ip地址和MAC映射更新ARP缓存,本地缓存是有生命周期的,生命周期结束后,将再次重复上述过程,B的mac地址一旦确定,A就向B发送IP通信了。
0 0