计算机网络协议

 
OSI 七层协议(open system interconnection)
 
依据定义来说,越接近硬件的阶层为底层 (layer 1),越接近应用程序的则是高层 (layer 7)。
不论是接收端还是发送端,每个一阶层只认识对方的同一阶层数据。
 
物理层
功能:
  • 为数据端设备提供传送数据的通路
  • 传输数据
  • 定义电压信号,了解传输编码方式;
 
数据链路层
分为两层
  • 逻辑链路子层
    • 帧同步
      • 为了使传输中发生差错后只将有错的有限数据进行重发
      • 数据链路层将比特流组合成以帧为单位传送。每个帧要
      • 传送数据外,还包括校验码,以使接受方能发现传输中的差错。
      • 从比特流中区分出帧的起始于终止就是帧同步;
    • 错误控制
    • 流量控制
  • MAC介质访问控制子层
    • 调度
      • 将逻辑信道映射到传输信道
 
网络层
“路由选择与逻辑寻址”
目的是实现两个端系统之间的数据透明传送
功能
  • 路由选择
    • 静态路由
    • 动态路由
  • 路由及逻辑寻址
 
传输层
定义了发送端与接收端的联机技术(TCP,UDP)
功能:
  • 封包格式
  • 数据封包的传送
  • 流程的控制
  • 传输过程的侦测与复原重新传送
确保各个资料封包可以正确无误的到达目的端。
 
会话层
“对话与交谈”
功能:
  • 为会话实体建立连接
  • 数据传输阶段
  • 连接释放
 
表示层
“通用的数据格式”
主要作用是为异种通信提供一种公用语言,
每台计算机可能有它自己的表示数据的内部方法,
例如,ASCII码与EBCDIC码,所以需要表示层协定来保证不同的计算机可以彼此理解。
功能:
  • 语法转换
  • 语法协商
  • 连接管理
 
应用层
应用层并不属于应用程序所有,而是定义应用程序如何进入此层的沟通接口,以将数据接收或传送给应用程序。
 
七层协议只是一个参考模型,并没有很多程序会真的使用这七层模型;只是七层模型解释网络传输的情况来说,非常清楚。
实际联网程序代码,使用TCP/IP协议;
 
TCP/IP协议
 

 

2.2 tcp/ip--链接层

 
 
tcp/ip最底层的链接层主要与硬件比较有关系。
 
2.2.2 局域网络使用的设备--以太网络
但实际使用的只有 1,2,3,6 蕊而已, 其他的则是某些特殊用途的场合才会使用到;即橙白,橙,绿白,绿,四根线使用到了;
 
mac的封装格式
 
局域网与跨网段传输
  • 局域网中传输使用mac地址。
  • 其他网段,先是IP寻址,然后ARP地址解析协议,找到对应MAC地址,再传数据; 
  • 只有透过路由器,才将封包送到另一个网域;
 
MTU 最大传输单位
  • 上面的最大传输量就是1500bytes,这个就是MTU数值;
  • 每种网络接口的MTU都不同,有些为1492MTU,不过在以太网络上,标准定义就是1500bytes。
 
而IP封包中,最大可以到65535bytes。既然礼物(IP)比盒子(MAC)大,那么怎么放的进去?
此时IP封包是可以进行拆解的,然后才能放到MAC当中,等数据都传到目的地,再由目的地的主机将他们组装回来。
 
当然MTU大的话,会减少IP封包次数,提升传输效率;但是不能确保目的地接受媒体支持这种MTU,并且能很好的适配。因此不建议更改标准的MTU值;
 
2.3 tcp/ip--网络层

 
网络层最重要的就是IP 与 路由
 
2.3.1 IP 封包的封装
ip 封包可以达到65535bytes,在比mac大的情况下,操作系统会对IP进行拆解的动作。
 

 

  • version(版本)
    • 宣告这个ip封包的版本,目前ipv4
  • IHL(Internet header length,ip表头的长度)
    • 使用的单位是字组(word),一个字组为4bytes
  • type of service(服务类型)
  • total length(总长度)
  • identification (辨别码)
    • 在拆分,合并时,通过这个辨别码来识别,各分拆ip包是否是同一个大ip
  • Flages(特殊旗标)
    • 内容为[0DM]
    • D:0表示可以分段,1表示不可分段
    • M:0表示ip为最后分段,1表示非最后分段;
  • fragment offset(分段偏移)
    • 表示目前这个ip分段在原始的ip封包中所占的位置。像序号;
    • 通过total length,identification,flags,fragment offset 就能将小IP分段在接受端组合起来;
  • Time to live(TTL,存活时间)
    • 表示IP封包的存活时间,范围0--255,。当这个IP封包通过一个路由器时,TTL就会减一,当TTL为0时,就直接丢弃。
  • protocol number(协议代码名)
    • 记载每种数据封包的内容。
    • 相关封包协议代码名
      • icmp,igmp,ggp,ip,tcp,egp,udp
    • 比较常见的就是TCP,UDP,ICMP(internet control message protocol)
  • header checksum(表头检查码)
    • 用做IP表头的错误检验
  • source address
  • destination address
  • options(其他参数)
    • 这个是额外功能,提供包括安全处理机制,路由记录,时间戳,严格与宽松之来源路由等
  • padding(补齐项目)
    • 由于options的内容不一定有多大,但IP每个数据都必须要是32bits,当options不足32时用padding补齐;
 
重点
  • 分拆合并的4个
    • total length
    • identification,识别数据哪个IP包
    • flags,特殊旗帜,可不可分段,是否为最后分段
    • fragment offset;此封包在原封包的位置
  • 目标地址与原地址
    • destination address ,source address
  • TTL:存活时间,每经过一个路由则减一,为0 则丢弃
  • protocol
    • 是哪种类型数据包
    • icmp,ip,tcp,udp
 
2.3.2 IP地址的组成与分级
IP:网络号与主机号
 
主机号
  • 全0 表示整个网段的地址  --Network
  • 全1 表示广播的地址        --Broadcast
 
ip地址等级
Class A : 0.xx.xx.xx---127.xx.xx.xx
Class B : 128.xx.xx.xx-191.xx.xx.xx
Class C : 192.xx.xx.xx-223.xx.xx.xx
 
2.2.3 netmask(子网掩码)
 
分割IP地址哪些是位是网络段,哪些是主机段;
 
IP地址每一位与子网掩码每一位做与 得出的非0的即是网络段,为0的就是主机段;
 
子网掩码作用:举例
  • netmask:255.255.255.0 
  • IP:192.168.1.1
    • 1与任何数做与;得任何数
    •  0月任何数做与;得0
    • 此时 255.255.255.0 与 192.168.1.1 做与
    • 得 192.168.1.0 则网络号段192.168.1  主机号段是0;
 
 
子网切分举例
  • 原本的 C Class 的 Net_ID 与 Host_ID 的分别
    • 11000000.10101000.00000000.00000000 Network: 192.168.0.0
    • 11000000.10101000.00000000.11111111 Broadcast: 192.168.0.255
    • |----------Net_ID---------------|---host--|
  • 切成两个子网之后的 Net_ID 与 Host_ID 为何?
  • 11000000.10101000.00000000.0 0000000 多了一个 Net_ID 了, 为 0 (第一个子网)
  • 11000000.10101000.00000000.1 0000000 多了一个 Net_ID 了, 为 1 (第二个子网)
  • |----------Net_ID--------------|----host---|
  • 第一个子网
  • Network:    11000000.10101000.00000000.0 0000000 192.168.0.0
  • Broadcast: 11000000.10101000.00000000.0 1111111 192.168.0.127
  • Netmask:   11111111.11111111.11111111.1 0000000 255.255.255.128
  • 第二个子网
  • Network:   11000000.10101000.00000000.1 0000000 192.168.0.128
  • Broadcast: 11000000.10101000.00000000.1 1111111 192.168.0.255
  • Netmask:  11111111.11111111.11111111.1 0000000 255.255.255.128
依靠netmask来做子网切分;
计算子网的快捷方式
其实子网的计算是有偷吃步的,我们知道 IP 是二进制,每个位就是 2 的次方。又由于 IP 数量都是平均分配到每个子网去, 所以,如果我们以 192.168.0.0 ~ 192.168.0.255 这个网段来说,要是给予 Net_ID 是 26 位时,总共分为几段呢? 因为 26-24=2 ,所以总共享掉两个位,因此有 2 的 2 次方,得到 4 个网段。再将 256 个 IP 平均分配到 4 个网段去, 那我们就可以知道这四个网段分别是:
· 192.168.0.0~192.168.0.63
· 192.168.0.64~192.168.0.127
· 192.168.0.128~192.168.0.191
· 192.168.0.192~192.168.0.255
 
实际上就要有Network以及Netmask就能表示一个网域,因为Broadcast能推算出来即主机号全1;
 
所以有了新的写法:
 
Network/Netmask
192.168.0.0/255.255.255.0
192.168.0.0/24 <==因为 Net_ID 共有 24 个 bits
 
 
2.3.5路由的概念
每一个主机都会维护一个路由表,会根据路由表中地址,根据IP包的目标地址选择路由器,然后发送到路由器,就不管了;
至于在同一网段的,不用发送到路由器,则是按照下层链接层的ARP,地址解析将IP地址解析成MAC地址,然后按照MAC地址发送出去;
 
观察路由情况
route
 
2.3.6 IP与MAC:链结层ARP与RARP协定;
 
以太网络主要使用网卡卡号(MAC地址),来传输数据的;
 
ARP(Address resolution protocol,网络地址解析)协议
RARP(Revers ARP,反向网络地址解析)协议
 
当想知道某个IP与哪张网卡绑定时,我们主机会向整个局域网发出ARP封包,对方收到ARP封包后就会回传他的MAC地址给我们;
我们的主机就知道了这个IP的对应MAC地址,接下来就是传输数据啦。
 
为了避免每次传输数据,都要ARP,因此,当使用ARP协议取得目标IP的mac地址后,我们将这对应关系记录到ARP table中(内存内的数据)记录20分钟;
 
使用arp指令驱动 ARP表格内的IP/MAC对应数据。
[root@www ~]# arp -[snd] 
选项与参数:
-n :将主机名以 IP 的型态显示
-d :将 hostname 的 hardware_address 由 ARP table 当中删除掉
-s :设定某个 IP 或 hostname 的 MAC 到 ARP table 当中

 

范例一:列出目前主机上面记载的 IP/MAC 对应的 ARP 表格
[root@www ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.1.100 ether 00:01:03:01:02:03 C eth0
192.168.1.240 ether 00:01:03:01:DE:0A C eth0
192.168.1.254 ether 00:01:03:55:74:AB C eth0

 

范例二:将 192.168.1.100 那部主机的网卡卡号直接写入 ARP 表格中
[root@www ~]# arp -s 192.168.1.100 01:00:2D:23:A1:0E
# 这个指令的目的在建立静态 ARP

 

2.3.8  ICMP协议
Internet control message protocol ,因特网信息控制协议。
icmp
  • 错误侦测与回报的机制
  • 确保网络联机状态与联机正确性
  • 网络层重要的封包之一
  • 不是独立的而是纳入到IP的封包中,也就是说ICMP同样是透过IP封包进行数据传输的。
  • ---ip封包中protocol number 字段会告知是TCP,UDP,ICMP还是其他什么数据;
在Internet上有传送能力的就是IP封包;
 
ICMP有相当多的类别可以侦测与回报,常见的ICMP的类别(type)
 
如何利用ICMP检验网络的状态
ping与traceroute;可以透过ICMP封装包的辅助来确认与回报网络主机的状态。
在设定防火墙的时候,ICMP封包不应该全部当掉;
 
2.4 TCP/IP--传输层封包与数据 

 
        网络层的IP封包只负责把数据送到正确的目标主机去,至于封包到底有没有成功正确被接受,那就不是网络层IP协议的事情,而是传输层的事情了。
 
2.4.1  TCP协议
     传输层TCP封包数据必须要能够放到IP的数据袋中才行。如图所示:
 

 

TCP封包表头资料:
 

 

  • source port
    • 来源端口号(如mysql 默认3306端口)
  • destination port
    • 目标端口号(如mysql 默认3306端口)
  • sequence number (封包序号)
    • 记录每个封包的序号,可以让接受端重新将TCP数据组合起来
    • 类似IP封包中的identification(辨别码),flags,fragment offset
    • 因为TCP封包必须要带入IP封包中,所以当TCP数据太大(大于IP封包的容许程度),就得进行分段;
  • acknowledge number(回应序号)
    • 当主机给client端的回应
    • client端收到这个确认码时,就确定之前传递的封包已经被正确手下。
  • data offset(资料补偿)
    • 上图中有个options字段,长度是非固定的,是确认整个TCP封包的大小,就需要这个标志来说明整个封包区段的起始位置。
  • reserved(保留)
    • 未使用的保留字段
  • code(control flag ,控制标志码)
    • 说明联机状态的句柄,好让接收端了解这个封包的主要动作
    • 6个字段,代表6个句柄
      • urg(urgent): 若为 1 则代表该封包为紧急封包, 接收端应该要紧急处理,且图 2.4-1 当中的 Urgent Pointer 字段也会被启用
      • ACK(Acknowledge):若为 1 代表这个封包为响应封包, 则与上面提到的 Acknowledge Number 有关
      • PSH(Push function):若为 1 时,代表要求对方立即传送缓冲区内的其他对应封包,而无须等待缓冲区满了才送
      • RST(Reset):如果 RST 为 1 的时候,表示联机会被马上结束,而无需等待终止确认手续。这也就是说, 这是个强制结束的联机,且发送端已断线
      • SYN(Synchronous):若为 1,表示发送端希望双方建立同步处理, 也就是要求建立联机。通常带有 SYN 标志的封包表示『主动』要连接到对方的意思
      • FIN(Finish):若为 1 ,表示传送结束,所以通知对方数据传毕, 是否同意断线,只是发送者还在等待对方的响应而已。
  • window(滑动窗口)
    • 主要是用来控制封包的流量的,可以告知对方目前本身有的缓冲器容量(receive buffer)还可以接收包。当window=0时,代表缓冲器已经额满,所以应该要暂停传输数据。
  • checksum(确认查验码)
    • 数据发送前会进行一个校验动作,并将该校验值填入次字段
    • 接收端,在接收完数据后,也会对数据校验,然后比较两次校验值是否相等。
  • urgent pointer(紧急资料)
    • 在code字段内urg=1时才会产生作用。可以告知紧急数据所在的位置
  • options(任意资料)
    • 目前此字段仅应用于表示接收端可以接收的最大数据区段容量,若此字段不使用,表示可以使用任意数据区段的大小。这个字段较少使用。
  • Padding(补足字段)
    • 如同 IP 封包需要有固定的 32bits 表头一样, Options 由于字段为非固定,所以也需要 Padding 字段来加以补齐才行。同样也是 32 bits 的整数。
 
通讯端口
在上面TCP表头中,最重要的就是source port ,destination port。因为是16位的,所以最大端口可达65535(2的16次方)!
 
网络是双向的,服务器与客户端要达成联机的话, 两边应该要有一个对应的端口来达成联机信道,好让数据可以透过这个信道来进行沟通。
 
如果IP 是网络世界的门牌号,那么这个端口号就是门牌号上建筑物的楼层。
所以, IP 是门牌, TCP 是楼层,真正提供服务的, 是在该楼层的那个人 (程序)!
 
特权端口
Internet中规定了一些固定port,在Linux中/etc/services

 

值的注意的是小于1024的端口要启动时,必须是root才行。用root启动的端口叫做特权端口。
 
2.4.2 TCP 的三次握手
 
发送端请求,SYN=1,封包序号=10001,接收端回过来的ACK=1,回应序号=10002;

回应序号比封包序号大1;

 

 
  • A:封包发起
    • 客户端必须随机取用一个大于 1024 以上的端口口来做为程序沟通的接口。
    • 然后在TCP 的表头当中,必须要带有 SYN 的主动联机(SYN=1),并且记下发送出联机封包给服务器端的序号 (Sequence number = 10001) 。
  • B:封包接收与确认封包传送
    • 当服务器接到这个封包,并且确定要接收这个封包后,就会开始制作一个同时带有 SYN=1, ACK=1 的封包, 其中那个 acknowledge 的号码是要给 client 端确认用的,所以该数字会比(A 步骤)里面的 Sequence 号码多一号 (acknowledge = 10001+1= 10002),
    • 那我们服务器也必须要确认客户端确实可以接收我们的封包才行,所以也会发送出一个 Sequence (seq=20001) 给客户端,并且开始等待客户端给我们服务器端的回应喔!
  • C:回送确认封包
    • 当客户端收到来自服务器端的 ACK 数字后 (10002) 就能够确认之前那个要求封包被正确的收受了,
    • 接下来如果客户端也同意与服务器端建立联机时,就会再次的发送一个确认封包 (ACK=1) 给服务器,亦即是 acknowledge = 20001+1 =20002
  • D:取得最后确认
    • 若一切都顺利,在服务器端收到带有 ACK=1 且 ack=20002 序号的封包后,就能够建立起这次的联机了
 
牢记一个事实就是[网络是双向的], 所以不论是服务器端还是客户端,都必须要透过一次 SYN 与 ACK 来建立联机,所以总共会进行三次的交谈;
 
实际演示:
1. 鸟哥说:   A 同学你在不在?
2. A 同学说:我在!那鸟哥你在不在?
3. 鸟哥说:    我也在
此时两个人就确认彼此都可以听到对方在讲啥,这就是可靠联机啦!
 
2.4.3 非连接导向的UDP协议
 
UDP 的全名是:『 User Datagram Protocol, 用户数据流协议』, UDP 与 TCP 不一样, UDP 不提供可靠的传输模式,
因为他不是面向连接的一个机制,这是因为在 UDP的传送过程中,接受端在接受到封包之后,不会回复响应封包 (ACK) 给发送端,
所以封包并没有像 TCP 封包有较为严密的检查机制。
 
     UDP表头资料:
 
TCP
  • 传输可靠
  • 速度慢
UPD
  • 由于表头数据较少,因此可以存更多data
  • 适合实时反应的一些数据流,例如影像
  • 不需要考虑联机要求,联机终止,流量控制等特性。
  • 数据正确性不保证
 
其实很多软件同时提供TCP/UDP两种传输协议。如DNS服务。
 
posted on 2016-10-12 10:53  Aiapple  阅读(374)  评论(0编辑  收藏  举报