网络协议.docx
《网络协议.docx》由会员分享,可在线阅读,更多相关《网络协议.docx(15页珍藏版)》请在冰豆网上搜索。
![网络协议.docx](https://file1.bdocx.com/fileroot1/2022-11/24/397a27b0-2c10-4f3f-97d1-57003b03abf1/397a27b0-2c10-4f3f-97d1-57003b03abf11.gif)
网络协议
物理层
⏹功能:
物理层负责数据以比特流的形式在物理介质中传输
⏹物理介质:
就是实际连接网络的设备,不同的接入技术使用不同的介质。
比如:
HFC使用光纤和同轴电缆;普通的调制解调器、ISDN和ADSL使用的是铜制双绞线;无线接入网使用的是无线频谱。
采用的信号技术:
电信号和光信号
数据链路层
⏹功能:
数据链路层协议在一个单独的链路上移动数据报,数据链路层协议定义了在链路各端的节点之间交换数据单元的格式以及这些这些节点发送和接收这些数据报单元时进行的活动。
确保网络中数据的可靠传输
⏹数据单元形式:
Frame
⏹链路层协议:
以太网(Ethernet)、令牌环、FDDI和PPP
⏹特性:
可以在路径的不同链路中用不同的链路层协议处理数据报
网络层
⏹功能:
管理节点间的网络连接,主要实现有三个功能:
1.确定路径(选路)
2.交换分组
3.呼叫建立
⏹路由算法:
距离向量(DV)
链路状态(LS)
传输层
⏹链路管理:
数据链路的建立、维持和释放;
⏹帧同步:
收方能从收到的比特流中区分一帧开始和结束的地方;
⏹流量控制:
发方发送数据的速率必须使收方来得及接收;
⏹差错控制:
收方收到有差错的数据帧时,能检错重传或纠错;
⏹透明传输:
不管所传数据是什么样的比特组合,收方都能正确接收。
并能将数据与控制信息分开;
⏹寻址:
保证每一帧都能发送到目的站。
会话层和表示层
⏹会话层负责计算机之间会话的建立和管理
⏹表示层负责解释数据并把数据转换后的结果送到应用层
应用层
⏹任务
⏹为用户提供服务。
⏹应用层协议
⏹规定应用进程在通信时所遵循的协议。
⏹网际协议[IP]
⏹传输控制协议[TCP]
⏹用户数据报协议[UDP]
⏹地址解释协议[ARP]
⏹网际控制报文协议[ICMP]
IP地址是一组32位的二进制数字,由四个字节构成,代表了网络和主机的地址。
单一网络下的组成形式
IP地址=网络地址+主机地址
切割成若干个子网时的形式
IP地址=网络地址+子网地址+主机地址
原先的主机地址=子网地址+主机地址
网络中IP地址、网络号码和
子网掩码的关系
IP地址AND子网掩码=网络号码
地址解析协议ARP
⏹解决IP地址与MAC地址的转换(映射)问题。
⏹IP地址是主机在网络层中的地址,为32bit;
⏹MAC地址是数据链路层中的硬件地址,为48bit;
⏹要发送的IP数据报必须转变为MAC帧,才能发送到网络。
因此需要在IP地址和MAC地址之间进行转换;
⏹若用户使用主机名字标识主机,因此需要在主机名字和IP地址之间进行转换;
反向地址解析协议RARP
⏹解决MAC地址与IP地址的转换(映射)问题。
⏹主要用于无盘工作站启动;
⏹RARP的工作过程:
⏹–在局域网中有一个主机充当RARP服务器;内建硬件地址到IP地址的映射表。
⏹–无盘工作站广播发送一个RARP请求分组,内含自己的硬件地址;
⏹–RARP服务器收到RARP请求分组后,从映射表中查出该无盘工作站的IP地址,然后发回一个RARP响应分组,内含无盘工作站的IP地址;
⏹–无盘工作站收到RARP响应分组后,就获得自己的IP地址。
为了不必去记忆那些难记的IP地址,能够通过有意义的文字来记忆网络地址,便出现了域名系统(DNS,DomainNameSystem)。
DNS的功能,简单地说,就是通过名称数据库将主机名称转换为IP地址。
也可反向转换,即将IP地址转换为主机名称。
域名注册
域名注册是Internet中用于解决地址对应问题的一种方法。
域名注册遵循先申请先注册原则,管理机构对申请人提出的域名是否违反了第三方的权利不进行任何实质审查。
每个域名都是独一无二的,不可重复的。
域名解析
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务。
域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。
用户数据报协议-UDP
⏹无连接的服务
⏹只是在IP的数据报上增加了端口功能。
⏹UDP数据报的最大长度=65535-20=65515字节
⏹(IP数据报的最大长度-IP数据报的最小首部)
传输控制协议[TCP]
⏹面向连接的服务;
⏹全双工点对点通信;
⏹完全可靠(无丢失、无重复、无乱序);
⏹可靠的连接建立和连接释放。
网际协议[IP]
IP协议是异地间数据包传输最基本的协议集,在网络层实现,提供无连接、无确认的服务,下面给出IP协议的特性:
a.因为IP是无连接的,所以每个数据都作为独立的单元传输
b.IP协议无须确认,不提供对数据包是否到达、目的地的检测机制
c.IP不关心数据包通过因特网传输时所取的路径,路由选择有其他协议完成。
⏹与IP协议配套使用的协议
⏹地址解析协议ARP
⏹反向地址解析协议RARP
⏹因特网控制报文协议ICMP
套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
一般的网络系统都提供了以下3种不同类型的套接字:
流式套接字(SOCK_STREAM)。
数据报套接字(SOCK_DGRAM)。
原始套接字(SOCK_RAW)。
流套接字(SOCK_STREAM):
流套接字用于提供面向连接、可靠的数据传输服务。
该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。
流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(TheTransmissionControlProtocol)协议。
数据包套接字(SOCK_DGRAM):
数据包套接字提供了一种无连接的服务。
该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
数据包套接字使用UDP(UserDatagramProtocol)协议进行数据的传输。
由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
原始套接字(SOCK_RAW):
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:
原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。
因此,如果要访问其他协议发送数据必须使用原始套接字。
⏹带外数据
⏹带外数据(out—of—banddata),有时也称为加速数据(expediteddata),
是指连接双方中的一方发生重要事情,想要迅速地通知对方。
⏹阻塞模式
⏹在阻塞模式下,程序在调用接收函数时(如recv),如果没有数据到达,此函数会一直等待,即当前线程会被阻塞,直到有数据时才返回!
换句话说,没有数据到达时,程序回在这行代码上等待,不继续往下执行。
有数据到达后,函数返回
⏹在非阻塞模式下,程序在调用接收函数时,接收函数会立即返回,调用方还可以进行其它操作,而当有数据到达进,操作系统会通过某些方法(如事件)来通知你!
换句话说,不论是否有数据到达,程序一直往下执行。
而数据到达后,操作系统会通知程序,程序根据操作系统通知的信息来做相应处理
在WINDOWSSOCKETS设计中,对于不能立即完成的阻塞操作做如下处理:
DLL初始化→循环操作。
在循环中,接收/发送WINDOWS消息,检查调用是否完成,,是否超时,必要时,终止循环,退出阻塞。
可以调用WSACancelBlockingCall()函数取消此阻塞操作,即发送取消任务消息至阻塞函数的线程
⏹非阻塞模式
⏹在非阻塞模式下利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态下。
⏹ 通常需要从CSocket类派生一个新类,派生新类的目的是重载socket事件的消息函数,然后在socket事件的消息函数中添入合适的代码以完成Client端与Server端之间的通信,与阻塞模式相比,非阻塞模式无需创建一个新线程。
⏹ 这里将讨论当Server端socket事件-FD_ACCEPT被触发后,该事件的处理函数OnAccept是如何进一步被触发的。
其它事件的处理函数如OnConnect,OnReceive等的触发方式与此类似。
Winsock寻址
⏹Winsock要兼容多个协议,因此要使用通用的寻址方式
structsockaddr
{
u_shortsa_family;//指定地址家族
charsa_data[14];/*协议相关的地址,不同的地址家族存储内容不同*/
}
字符串地址到值转换
⏹Unsignedlonginet_addr(constchar*cp);
⏹将“127.0.0.1”这样的地址转换为网络顺序存储的32位二进制数
⏹Char*inet_ntoa(structin_addrin);将32位二进制数转换为字符串
流套接字编程模型
⏹服务端:
⏹1套接字的创建和关闭
⏹2绑定套接字到指定的IP地址和端口号
⏹3设置套接字进入监听状态
⏹4接收连接请求
⏹5收发数据
⏹客户端:
⏹1套接字创建和关闭
⏹2申请建立连接
⏹3收发数据
⏹4断开连接,关闭
数据报编程模型
服务端:
创建套接字
绑定IP地址和端口
收发数据
关闭连接
客户端:
创建套接字
收发数据
关闭连接
⏹阻塞模式/非阻塞模式
⏹select模型
⏹WSAAsyncSocket模型
⏹WSAEventSelect模型
⏹Overlapped重叠IO模型
⏹Completionport完成端口模型
select(选择)模型是winSock中最常见的I/O模型。
WSAAsyncSelect是一个简单的异步socketIO模型.。
WSAEventSelect与WSAAsyncSelect一样也是一种异步事件通知模型,不同的是WSAAsyncSelect是与窗口句柄关联在一起的,必须要要窗口才行,而WSAEventSelect是与事件对象关联的。
套接字选项和IO控制命令
⏹getsockopt获取套接字选项
⏹setsockopt设置套接字选项
⏹ioctlsocketIO控制
⏹WSAIoctl微软扩充的IO控制
主要的Winsock函数
1.创建套接口SOCKET()
SOCKETsocket(intaf,inttype,intprotocol);
举例:
SOCKETsockfd=SOCKET(AF_INET,SOCK_STREAM,0);/*创建一个流式套接字。
SOCKETsockfd=SOCKET(AF_INET,SOCK_DGRAM,0);/*创建一个数据报套接字。
将套接口绑定到指定的网络地址BIND()
intbind(SOCKETs,conststructsockaddr*name,intnamelen);
相关的三种Winsock地址结构
有许多函数都需要套接字的地址信息,像UNIX套接字一样,Winsock也定义了三种关于地址的结构,经常使用。
①通用的Winsock地址结构,针对各种通信域的套接字,存储它们的地址信息。
structsockaddr{
u_shortsa_family;/*地址家族
charsa_data[14];/*协议地址
}
3.启动服务器监听客户端的连接请求LISTEN()
intlisten(SOCKETs,intbacklog);
4.接收连接请求ACCEPT()
SOCKETaccept(SOCKETs,structsockaddr*addr,int*addrlen);
5.请求连接CONNECT()
intconnect(SOCKETs,structsockaddr*name,intnamelen);
6.向一个已连接的套接口发送数据SEND()
intsend(SOCKETs,char*buf,intlen,intflags);
7.从一个已连接套接口接收数据RECV()
intrecv(SOCKETs,char*buf,intlen,intflags);
8.按照指定目的地向数据报套接字发送数据SENDTO()
intsendto(SOCKETs,char*buf,intlen,intflags,structsockaddr*to,inttolen);
9.接收一个数据报并保存源地址,从数据报套接字接收数据RECVFORM()
intrecvfrom(SOCKETs,char*buf,intlen,intflags,structsockaddr*from,int*fromlen);
10.关闭套接字CLOSESOCKET()
intclosesocket(SOCKETs);
11.禁止在一个套接口上进行数据的接收与发送SHUTDOWN()
intshutdown(SOCKETs,inthow);
2.获取与套接口相连的端地址GETPEERNAME()
intgetpeername(SOCKETs,structsockaddr*name,int*namelen);
3.获取一个套接口的本地名字GETSOCKNAME()
intgetsockname(SOCKETs,structsockaddr*name,int*namelen);
4.将一个点分十进制形式的IP地址转换成一个长整型数INET_ADDR()
unsignedlonginet_addr(constchar*cp);
5.将网络地址转换成点分十进制的字符串格式INET_NTOA()
char*inet_ntoa(structin_addrin);
Winsock的信息查询函数
WinsockAPI提供了一组信息查询函数,让我们能方便地获取套接口所需要的网络地址信息以及其它信息,
(1)Gethostname()
用来返回本地计算机的标准主机名。
intgethostname(char*name,intnamelen);
(2)Gethostbyname()
返回对应于给定主机名的主机信息。
structhostent*gethostbyname(constchar*name);
(3)Gethostbyaddr()
根据一个IP地址取回相应的主机信息。
structhostent*gethostbyaddr(constchar*addr,intlen,inttype);
(4)Getservbyname()
返回对应于给定服务名和协议名的相关服务信息。
structservent*getservbyname(constchar*name,constchar*proto);
(5)Getservbyport()
返回对应于给定端口号和协议名的相关服务信息。
structservent*getservbyport(intport,constchar*proto);
(6)Getprotobyname()
返回对应于给定协议名的相关协议信息。
structprotoent*getprotobyname(constchar*name);
(7)Getprotobynumber()
返回对应于给定协议号的相关协议信息。
structprotoent*getprotobynumber(intnumber);
●Select(选择)模型是Winsock中最常见的I/O模型。
●基本思想:
是利用select函数,实现对多个套接字I/O的管理。
利用select函数,可以判断一个或多个套接字的状态,某个套接字是否存在要读取的数据,或者能否向一个套接字写入数据;只有在条件满足时,才对套接字进行输入输出操作,从而避免无功而返的I/O函数调用,避免频繁产生WSAEWOULDBLOCK错误,使I/O变得有序。
●select的函数原型如下
●其中fd_set数据类型,代表一系列特定套接字集合
intselect(
intnfds,//为保持兼容而设,可忽略
fd_setFAR*readfds,
fd_setFAR*writefds,
fd_setFAR*exceptfds,
conststructtimevalFAR*timeout
●异步I/O模型通过调用WSAAsyncSelect()函数实现.
●利用这个模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。
●该模型的实现方法是通过调用WSAAsynSelect函数自动将套接字设置为非阻塞模式,并向WINDOWS注册一个或多个网络事件,并提供一个通知时使用的窗口句柄。
●当注册的事件发生时,对应的窗口将收到一个基于消息的通知。
WSAAsyncSelect函数
●函数的定义是:
intWSAAsyncSelect(
SOCKETs,//s为需要事件通知的套接字
HWNDhWnd,
unsignedintwMsg,
longlEvent
);
●WSAEventSelect事件选择模型和WSAAsyncSelect模型类似,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。
●该模型最主要的差别在于,网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。
获取主机名和IP地址
⏹gethostname()
⏹gethostbyname()
获取网卡类型和子网掩码
⏹RegOpenKeyEx()
⏹函数功能描述:
打开一个指定的注册表键
⏹RegCloseKey
⏹函数功能描述:
释放指定注册键的句柄
⏹RegCreateKeyEx
⏹该函数用来创建注册表键,如果该键已经存在,则打开它(注册表键不区分大小写)
⏹RegDeleteKey
⏹功能:
用来删除一个注册表键值。
⏹RegQueryValueEx
⏹获取一个项的设置值
⏹返回值Long,零(ERROR_SUCCESS)表示成功。
其他任何值都代表一个错误代码
⏹MAC:
MediaAccessControl,
⏹NIC:
NetworkInterfaceCard
⏹库文件:
Netapi32.lib,头文件:
Nb30.h
4.4获取系统支持的网络协议
⏹WSAEnumProtocols()目录
GetNetworkParams
⏹获取本地计算机的网络参数。
⏹参数Info[out]
⏹一个指向缓冲的指针,它包含一个FIXED_INFO结构,如果函数成功的话,该结构接收本地计算机的网络参数。
该缓冲必须在之前由GetNetworkParams函数分配。
⏹pOutBufLen[in]
⏹一个指向一个ULONG变量的指针,该变量指定FIXED_INFO结构的大小。
如果不够大,则该函数会以合适的大小来填充这个变量,并返回一个ERROR_BUFFER_OVERFLOW的错误代码。