- 首先先介绍MAC中帧头:
接下来是IP头部。
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 ;
{
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;
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;
{
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;
PSH:立即传输,不允许有延迟等待(为了不浪费网络资源,当需要发送ACK确认的时候,将延迟等待有数据的数据包,捎带确认。)。
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;
{
}__attribute__((packed))UDP_HEADER, *PUDP_HEADER;
注意:
- 为什么ip头部中是有目标ip地址,而TCP和UDP中只有目标端口?
首先先明白两个定义:
- TSAP:Transport Service Access Point传输服务访问点。(传输层的端口)
- NSAP:Network Service Access Point网络服务访问点。(网络层的IP)
应用进程可以将自己关联到一个本地的TSAP上,以便与一个远程TSAP建立连接,这些连接运行在每台主机的NSAP上,在有些网络上,每台计算机只有一个NSAP,但是可以有多个传输端点共享此NSAP,因此需要某种方法来区分这些传输节点。所以在IP的头部只需要说明IP地址,但是在TCP或者UDP中需要说明端口。
- 在上层传输都是通过ip地址来传,但是在数据链路层都是根据MAC地址来传输的,那么如何从ip地址转换到MAC地址的呢?
下面用一个流程来说明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地址。
- 根据主机A上的路由表内容,IP用于确定访问主机B的转发IP地址是192.168.1.2.然后主机A在自己本地的ARP缓存中检查B的匹配MAC地址。
- 若找不到,则它将询问192.168.1.2的硬件地址。所以主机A会发送ARP请求帧广播到本地网络上的所有主机,A的ip地址和MAC地址都包括在该ARP请求中,本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP匹配,若不匹配则丢弃ARP请求。
- 主机B确定ARP请求中的ip与自己的ip匹配,则将A的ip与mac地址映射添加到自己本地的ARP中。
- 主机B将包含MAC地址的ARP回复消息直接发送给A。
- A收到B发来的ARP回复消息时,会用主机B的ip地址和MAC映射更新ARP缓存,本地缓存是有生命周期的,生命周期结束后,将再次重复上述过程,B的mac地址一旦确定,A就向B发送IP通信了。