网络模型的基本理论
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络模型的基本理论相关的知识,希望对你有一定的参考价值。
基本概念
局域网:覆盖范围小,网线长度一般在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()操作即可产生挥手操作。
以上是关于网络模型的基本理论的主要内容,如果未能解决你的问题,请参考以下文章
入门实战《深度学习技术图像处理入门》+《视觉SLAM十四讲从理论到实践》