计算机网络协议
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服务。