一、概述
1、什么是计算机网络?
计算机网络,是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
2、什么是网络协议?
网络协议是一种特殊的软件,是计算机网络实现其功能的最基本的机制。网络协议的本质就是规则,即各种硬件和软件必须遵循的共同守则。网络协议并不是一套单独的软件,它融合于其它所有的软件甚至硬件系统中,因此可以说协议在网络中无所不在
3、什么是协议栈?
为了减少网络设计的复杂性,绝大多数网络采用分层设计的方法。所谓分层设计,就是按照信息的流动过程将网络的整体功能分解为一个个的功能层,不同机器上的同等功能层之间采用相同的协议,同一机器上的相邻功能层之间通过接口进行信息传递。各层的协议和接口统称为协议栈
4、OSI(Open System Interconnection)的七层协议
描述计算机网络各协议层的一般方法是采用国际标准化组织(International Standardization Organization, ISO)的计算机通信开放系统互连(Open System Interconnection, OSI)模型,简称ISO/OSI网络协议模型
– 应用层,为应用程序提供服务,处理业务逻辑,如http、ftp、pop3、smtp
– 表示层,处理在两个通信系统中交换信息的方式,如ASCII、JPEG、MJPG
– 会话层,建立、管理、终止会话,如SMB – 传输层,向用户提供可靠的端到端服务,如 TCP/UDP
– 网络层,为网络不同的主机提供通信,从中选择最适当的路径,如:IP协议
– 数据链路层,实现物理寻址,建立通信链路,如MAC
– 物理层,为数据端设备提供传送的物理媒体,对网卡的硬件驱动
5、TCP/IP协议族
TCP/IP不是个单一的网络协议,而是由一组具有层次关系的网络协议组成的协议家族,简称TCP/IP协议族
– TCP:传输控制协议,面向连接,可靠的全双工的字节流
– UDP:用户数据报协议,无连接,不如TCP可靠但速度快
– ICMP:网际控制消息协议,处理路由器和主机间的错误和控制消息
– IGMP:网际组管理协议,用于多播
– IPv4:网际协议版本4,使用32位地址,为TCP、UDP、ICMP和IGMP提供递送分组服务
– IPv6:网际协议版本6,使用128位地址,为TCP、UDP和ICMPv6提供递送分组服务
6、IP地址
IP地址是计算机在互联网中的唯一标识,具体可分为IPv4协议地址和IPv6协 议地址:
– IPv4:32位整数,如“0xC0A80F64”
– IPv6:128位整数,如“fe80:0000:0000:0000:dad9:b217:f207:bc35”
Qt中使用QHostAddress对象来表示一个IP地址,包括IPv4和IPv6,可以通过toString成员函数,将其转换为点分字符串的形式,也就是平时看到的地址,例如IPv4地址“0xC0A80F64”,对应字符串为“192.168.15.100”
QHostAddress的构造函数
– QHostAddress(quint32 ip4Addr)
– QHostAddress(const QString & address)
– ......
查询主机IP地址命令
– linux中使用“ifconfig”
– windows中“ipconfig”
特殊的IP地址
– QHostAddress::LocalHost 注:对应“127.0.0.1”表示本地环回地址,常用于本地测试
– QHostAddress::Any 注:对应“0.0.0.0”表示任意IP地址,常用于服务器
– QHostAddress::Broadcast 注:对应“255.255.255.255”表示广播地址,用于局域网广播消息
通过IP地址判断两台主机是否可以通信
– ping 对方IP地址/域名 注:用于确定本地主机是否能与对方主机成功交换(发送与接收)数据包,再根据 返回的信息,就可以推断通信响应速度、网络是否通畅
二、UDP通信
1、UDP协议简介
UDP (User Data Protocol,UDP)即用户数据报协议,是OSI参考模型中一 种无连接的传输层协议,它是一种简单轻量级、不可靠、面向数据报、无连接的 传协议,可以应用在可靠性要求不苛刻的场景 •
2、适合使用UDP通信的情况
通信的交互数据大多为短消息
拥有大量的客户端
对数据安全性无特殊要求
网络负担重,但对响应实时性要求较高
3、UDP通信模型
4、UDP通信类
QT提供了QUdpSocket类,该类封装了UDP套接字,可以非常方便的建立UDP通信的连接,通过bind()函数 实现绑定一个IP和端口,然后调用writeDatagram()函数实现发送消息,以及用 readDatagram()实现从UDP套接字读取消息。
– 如果想使用QIODevice类继承的read()/write()等标准的数据读写函数,必须首 先调用connectToHost(),建立套接字的连接 – 当QUdpSocket套接字有数据到来时,将会发送readyRead() 信号,所以不必单 独开启线程来处理连接,只需要在收到该信号时,再去读取数据报 – 当信号到来以后, hasPendingDatagrams()函数将返回true,这时可以调用 pendingDatagramSize()获得第一个的数据报的大小,然后再通过 readDatagram()函数读取它