码迷,mamicode.com
首页 > 其他好文 > 详细

网络模型的基本理论

时间:2016-01-23 22:59:14      阅读:580      评论:0      收藏:0      [点我收藏+]

标签:

基本概念

局域网:覆盖范围小,网线长度一般在100米以内。带宽固定。链路自己买设备维护。

广域网:距离比较远。花钱租带宽。链路由其他人管理。

ISP:电信运营商。

路由器:类似于一个网卡,需要一个IP,用于连接其他网段的设备。

网关:局域网内的机器连接为了连接其他网段所指定的设备的IP。

mac地址:物理地址。

 

OSI参考模型

分层是软件领域中常见的思想。著名的OSI分层模型,上层依赖下层,下层为上层服务。应用层为用户服务。

名称 说明
应用层 所能产生网络流量的程序。
表示层 传输前加密处理,或压缩处理。
会话层 可以理解成是一种TCP连接。
传输层 提供可靠传输或不可靠的传输,提供流量控制。
网络层 负责选择最佳路径,规划IP地址。
数据链路层 定义帧的开始和结束,透明传输,差错校验,但不纠正。
物理层 物理层为数据端设备提供传送数据的通路。定义了网络设备的接口标准,电器标准,线路速率。

 

 

TCP/IP协议和OSI参考模型

TCP/IP协议指的其实是指一组协议。

技术分享

 

 

数据封装(Data Encapsulation)

数据发送时,更具ISO七层模型或者TCP/IP四层模型,数据由上层向下层,逐层对数据就行封装。

  • 四层,协议层传输的是数据报文,主要是协议格式。
  • 三层,网络层传输的是数据包,包含数据报文,并且增加传输使用的IP地址等三层信息。
  • 二层,数据链路层传输的是数据帧,包含数据包,并且增加相应MAC地址与二层信息。

数据接收的时候,下层向上层解封装。封包与解包的过程非常类似与现实生活中的邮寄。邮寄物品需要将物品包装,并写上发信人和收件人。

 

 

PDU(Protocol Data Unit)

协议数据单元PDU(Protocol Data Unit)是指对等层次之间传递的数据单位。

  • 应用程序层次的PDU是报文(Message)
  • 传输层的 PDU是数据段(Segment)
  • 网络层的PDU是数据包(Packet)
  • 数据链路层的 PDU是数据帧(Frame)
  • 物理层的 PDU是数据位(Bit)

 

报文(Message)

站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

 

数据段(Segment)

传输层中,报文数据将被分段,每段数据被添加TCP报头(包含源端口,目的端口,顺序号等),形成数据段。

分段的原因:

(A)可同时多个应用程序发送数据。

(B)数据包过大产生错误时,还需重新传送,即占带快又占时间,小数据包对数据流影响就小很多。

(C)各种网络传输介质有其最大的传输单元限制,不允许在网络上出现巨大的数据包。

 

数据报(Datagram)

面向无连接的数据传输,工作过程类似于报文交换。采用数据报方式传输时,被传输的分组称为数据报。

通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。可以理解为传输数据的分组。我们将通过网络传输的数据的基本单元称为数据报。

 

数据包(Packet)

网络层中,数据段被添加IP报头(包含源IP地址,目的IP地址),形成数据包。

 

数据帧(frame)

数据链路层中,在数据包的包首添加了数据MAC报头(包含源MAC地址和目的MAC地址),在数据包的包尾添加帧校验位(侦校验:Frame Check Sequence,简称FCS),形成数据帧。

 

技术分享

 

交换机对数据帧的处理

交换机接收到数据流后根据发送过来的数据帧的MAC地址查找目的主机。如发现将数据发送给目的主机。转发过程不改变数据帧结构。

 

目的主机接收到数据帧的操作

当目的主机接收到数据帧后对比目的MAC,如是发送给自己的,则拆去数据帧头,发往网络层,网络层对比目的IP,如相同则拆包发往传输层,传输层再对比目的端口,确认相同则拆去数据段交给应用程进行数据组装。

 

 

 

TCP分段与IP分片

TCP分段和IP分片,工作在不同的层中。

区别:

  • IP分片产生的原因是网络层的MTU;TCP分段产生原因是MSS。
  • IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组。
  • 对于以太网,MSS为1460字节,而MUT往往会大于MSS。

故采用TCP协议进行数据传输,是不会造成IP分片的。若数据过大,只会在传输层进行数据分段,到了IP层就不用分片。IP分片通常是由于UDP传输协议造成的,因为UDP传输协议并未限定传输数据报的大小。

 

 

PDU报文头格式

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;

 

 

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;

 

 

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 ;

 

 

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;

 

 

 

TCP三次握手与四次握手

建立TCP连接——三次握手

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

技术分享

第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

技术分享

 

第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。

技术分享

 

第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方。并且在数据段放写ISN的+1。

技术分享

 

 

释放TCP连接——四次挥手

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

技术分享

 

 

 

 

网络模型的基本理论

标签:

原文地址:http://www.cnblogs.com/shijiaqi1066/p/5154162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!