一、编程准备——字节序、地址转化
1.1 字节序概述
概念:是指多字节数据的存储顺序
分类:
小端格式:将低位字节数据存储在低地址
大端格式:将高位字节数据存储在低地址
注意:
LSB:低地址
MSB:高地址
如何判断当前系统的字节序:
1.2 htonl函数
1、网络协议指定了通讯字节序——大端
2、只有在多字节数据处理时候才需要考虑字节序
3、运行在同一台计算机上的进程相互通信时一般不需要考虑字节序。
4、异构计算机之间的通讯,需要转换自己的字节序为网络字节序
在需要字节序转换的时候一般调用特定字节序转换函数
1.2.1 htonl (host—>network)
1.2.2 htons
1.2.3 ntohl
1.2.4 ntohs
1.3地址转换函数
人为识别的IP地址是点分十进制的字符串形式,但是计算机或者网络中识别的ip地址是整形数据,所以需要进行转换。
注意:下面这两个函数可用在ipv4和ipv6地址的转换
1.3.1 inet_pton()
1.3.2inet_ntop()
二、UDP介绍、概述
2.1 UDP概述协议,在传输数据前不需要
UDP协议
面向无连接的用户数据报协议,在传输数据前不需要先建立链接;目的地主机的运输层受到UDP报文后,不需要给出任何确认
UDP特点
1、相比TCP速度稍快些
2、简单的请求/应答应用程序可以使用UDP
3、对于海量传输不应该使用UDP
4、广播和多播应必须使用UDP
UDP的应用
DNS(域名解析)、NFS(网络文件系统)、RTP(流媒体)等。
一般语音和视频通话都是通过UDP实现。
2.2 网络编程接口socket
socket作用:
提供不同主机的进程间的通信
socket特点:
1、socket也称为“套接字”
2、是一种文件描述符,代表了一个通信管道的一个端点
3、类似对文件的操作一样,可以使用read、write、close等函数对socket套接字进行网络数据的收取和发送操作
4、得到socket套接字(描述符)的方法调用socket()
socket分类:
1、socket_STREAM,流式套接字,用于TCP
2、socket_DGRAM,数据报套接字,用于UDP
3、socket_RAW,原始套接字,用于链路层
2.3 UDP编程C/S架构
UDP网络编程流程:
服务器:
创建套接字socket()
将ip地址、端口号与套接字进行绑定bind()、接收数据recvfrom()、发送数据sendto()
客户端:
创建套接字socket()、发送数据sendto()、接收数据recvfrom()、关闭套接字close()
2.3 UDP编程--创建套接字
2.3.1 创建socket套接字
2.4 UDP编程-发送、绑定、接收数据
在网络编程中经常使用的结构体,sockaddr_in
2.5 两种地址结构使用场合
2.6 sendto发送
2.7 绑定--bind函数
绑定的目的是为了固定服务器的信息(IP地址和端口号)。
UDP网络程序想要收取数据需要什么条件?
确定的ip地址
确定的port
怎样完成上面的条件呢?
接收端 使用bind函数,来完成地址结构与socket套接字的绑定,这样ip、port就固定了
发送端在sendto函数中指定接收端ip、port,就可以发送数据了。
由于服务器是被动的,客户端是主动的,所以一般先运行服务器,后运行客户端,所以服务器需要固定自己的信息(ip地址和端口号),这样客户端可以找到服务器并与之通信,但是客户端一般不需要bind绑定,因为系统会自动给客户端分配ip地址和端口号。
2.8 接收数据--recvfrom函数
2.9 UDP编程--client、server
其实在网络编程开发中client和server双方既可以有发送数据还可以接收数据;一般认为提供服务的一方为server;而接收服务的是client。
3.0 UDP客户端注意点
1、本地IP、本地端口(我是谁)
2、目的IP目的端口(发给谁)
3、在客户端的代码中,我们只设置了目的IP和目的端口
4、客户端的IP和端口号系统会自动分配,不需要指定,如果指定了就需要bind绑定。
3.1 UDP服务器注意点
1、服务器之所以要bind是因为它的本地port需要是固定的,而不是随机的。
2、服务器也可以主动地给客户端发送数据
三、UDP编程——TFTP、广播、多播
3.1 TFTP简介、通信过程
3.1.1 TFTP概述
TFTP:简单的文件传输协议
最初用于引导 无盘系统,被设计用来传输小文件
特点:
基于UDP协议实现
不进行用户有效性认证
数据传输模式:
octet:二进制模式
netascii:文本模式
mail:已经不在支持
3.1.2 TFTP通信过程
总结:
1、服务器在69号端口等待客户端的请求
2、服务器若批准此请求,则使用临时端口与客户端进行通信
3、每个数据包的编号都有变化(从1开始)
4、每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的包(数据包ACK)
5、数据长度以512Byte传输
6、小于512Byte的数据意味着传输结束
注意:
以上0代表字符'\0';不同差错码对应不同错误信息。
3.1.3 练习—TFTP客户端
要求:
使用TFTP协议,下载server上的文件到本地文件
思路:
1、构建请求报文,送至服务器(69号端口)
2、等待服务器回应
3、分析服务器回应
4、接收数据,知道接收的数据包小于规定数据长度
通过软件设置服务器:服务器的IP地址就是Windows的IP地址
客户端代码:
结果:
4.1 UDP广播
4.1.1 广播的概念
广播:由电台主机向该所在子网内的所有主机发送数据的方式
广播只能用UDP或原始IP实现,不能用TCP
用途:
单个服务器与多个客户主机通信时减少分组流通
以下几个协议都用到广播:
1、地址解析协议(ARP)
2、动态主机配置协议(DHCP)
3、网络时间协议(NTP)
特点:
1、处于同一子网的所有主机都必须处理数据
2、UDP数据包含会沿协议栈向上一直到UDP层
3、运行音视频等较高速率工作的应用,会带来大负
4、局限于局域网内使用
4.1.2 广播的地址
4.1.3 广播与单播的对比
单播:
广播:
4.2 广播流程
发送者:
第一步:创建套接字socket()
第二步:设置为允许发送广播权限setsockopt()
第三步:向广播地址发送数据sendto()
接收者:
第一步:创建套接字socket()
第二步:将套接字与广播的信息结构体绑定bind()
第三步:接收数据recvfrom()
5.1 UDP多播
5.1.1 概述
多播概述
多播:
数据的收发仅仅在同意分组中进行,所以多播又成为组播。
多播的特点:
1、多播地址标示一组接口
2、多播可以用于广域网使用
3、在IPV4中,多播是可选的
5.1.2 多播地址
5.1.3 多播工作过程
比起多播,多播具有可控性,只有加入多播组的接收者才可以接收数据,否则接收不到。
5.1.4 多播流程
发送者:
第一步:创建套接字socket()
第二步:向多拨地址发送数据sendto()
接收者:
第一步:创建套接字socket()
第二步:设置为加入多播组setsockopt()
第三步:将套接字与多播信息结构体绑定bind()
第四步:接收数据
5.1.5 多播套接口选项
5.1.6 加入多播组演示
sendto:
recvfrom: