复习范围+要求.docx
- 文档编号:8564171
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:48
- 大小:42.46KB
复习范围+要求.docx
《复习范围+要求.docx》由会员分享,可在线阅读,更多相关《复习范围+要求.docx(48页珍藏版)》请在冰豆网上搜索。
复习范围+要求
(陈学俊整理)
一.网络基本知识
1.计算机网络的定义及组成
计算机网络定义:
计算机网络是利用通信线路和通信设备将具有独立功能的计算机连接起来而形成的计算机系统的集合,计算机之间借助通信线路传递信息,共享软件、硬件和数据等资源。
计算机网络系统的组成:
网络硬件:
服务器、工作站、网卡和通信介质等。
网络软件:
网络操作系统和网络协议软件。
2.网络体系结构的几个概念(协议、实体、接口、服务等)
协议:
为进行网络中的数据交换(通信)而建立的规则、标准或约定。
实体:
任何可以发送或接收信息的硬件/软件进程,每一层中的活跃元素。
对等实体:
位于不同系统内同一层次的两个实体。
协议作用在对等实体之间。
接口:
相邻两层之间交互的界面,定义相邻两层之间的原语操作及下层对上层的服务。
服务:
某一层及其以下各层通过接口提供给其相邻上层的一种能力,每种特定的服务通过服务访问点实现。
协议栈:
某一系统内的各层协议集。
网络体系结构:
计算机网络的层次结构及其协议的集合,相邻层间的接口以及服务统称为网络体系结构。
3.OSI参考模型、TCP/IP体系结构与TCP/IP协议栈
网络参考模型ISO/OSI:
应用层:
与用户应用进程的接口“做什么”
表示层:
数据格式的转化“对方看起来像什么”
会话层:
会话管理与数据传输同步“该谁讲话从哪儿讲起”
传输层:
端到端可靠的数据传输“对方在哪儿”
网络层:
分层传送,路由选择,流量控制“走哪条路可以到达对方”
数据链路层:
相邻结点间无差错的传送帧“每一步该怎么走”
物理层:
在物理媒体上透明传输位流“怎样利用物理媒体”
TCP/IP体系结构:
TCP/IP是一个协议系列,包含了100多个协议。
如:
TELNET、FTP、HTTP、DNS、SMTP;
TCP、UDP;
ICMP、IP、IGMP;
ARP、RARP;
TCP/IP的特点:
网络技术无关性(与厂商硬件无关)
通用互连(与网络上任何计算机通讯,识别IP)
点对点确认(确认应答)
应用协议标准(如电子邮件、远程登录等)
TCP/IP与OSI/RM的关系:
OSI5--7层:
应用层;Telnet,FTP,HTTP,DNS,SMTP;
OSI第4层:
传输层;TCP,UDP;
OSI第3层:
互连层;ICMP,IP,IGMP;
OSI1--2层:
网络接口层;ARP,RARP;
4.IP地址、广播地址、网络地址、回送地址、子网
(1)IP地址组成
由网络地址和主机地址组成。
4个字节,“.”隔开,每组数字只能是0-255。
(2)IP地址类型(*)
A类:
最高位为0,001.hhh.hhh.hhh---127.hhh.hhh.hhh
B类:
最高两位为10,128.001.hhh.hhh---191.254.hhh.hhh
C类:
最高三位为110,192.000.001.hhh---223.255.254.hhh
D类:
四个最高位为1110,将其留作IP多路复用组使用。
E类:
四个最高位为1111,留作将来使用。
(3)子网掩码
将IP地址格式中除了指定为主机地址之外的所有二进制均设置为1。
缺省时,A、B、C三类网络的掩码如下:
A类:
255.0.0.0
B类:
255.255.0.0
C类:
255.255.255.0
(4)几个特殊的IP地址
广播地址:
主机地址全“1”
网络地址:
主机地址全“0”
回送地址:
127.0.0.1
5.vi、g++使用(*)
(1)单文件编译、连接并生成可执行文件
$gcc–oex1.exeex1.cpp
文本编辑器vi的使用:
网络上查看!
二.套接口概念
1.端口、地址、网络字节顺序
网间进程通信:
单机环境:
不同进程用进程号(PID)唯一标识
网络环境:
与协议、地址、端口有关
端口:
进程通过系统调用与某端口建立连接后,传输层通过端口与进程通信。
端口操作类似一般的I/O操作,可以用读写原语访问,端口号类似于文件描述符。
不同协议(如TCP和UDP)可以有相同的端口号,不冲突。
地址:
网络地址、主机地址、进程标识(端口号),一个完整的网间进程通信需要三元组(协议,本机地址,本机端口号)或五元组标识(协议,本机地址,本机端口号,远程主机,远程端口号)
网络字节顺序:
不同计算机存放多字节值顺序不同,网络协议中需指定网络字节顺序。
2.Client/Server模式、Socket类型
(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET)
Client/Server模式:
网间进程通信的主要模式是客户机/服务器模式。
客户程序向服务程序发请求,服务程序接收来自客户程序的请求并处理,处理后把结果回送给客户,服务进程一般是先于客户请求启动的。
这两个进程往往通过网络连接在不同机器上,进程间的通信使用网络编程。
Socket:
应用程序调用编程接口实现网络编程。
Socket(套接字)可以在传输层、网际层和数据链路层上进行编程。
Socket类型:
InternetSocket(Internet地址)
UNIXSocket(本地节点路径名)
X.25Socket(X.25地址)
只讲InternetSocket,常用类型有:
流套接字SOCK_STREAM:
基于TCP协议。
数据报套接字SOCK_DGRAM:
基于UDP协议。
原始套接字SOCK_RAM:
允许对较低层次协议(如IP、ICMP)直接访问。
本地套接字:
通过socket技术可以实现不同主机上进程间通信,在单一主机上进程间的通信(IPC)也可用socket技术实现,用于移植远程客户/服务器程序到单一主机上。
3.Socket用到的数据结构:
sockaddr、sockaddr_in、in_addr、hostent及地址变量的初始化方法。
(*)(*)
创建套接口时使用:
intsocket(intdomain(取AF_INET),inttype,intprotocol);
AF_INET域使用的数据结构(地址族):
通用套接口地址(只是模型):
sockaddr
Internet(IPv4)套接口地址(AF_INET域):
sockaddr_in
Socket用到的数据结构(P23):
(*)
#include
(1)存储地址和端口信息的sockaddr
structsockaddr
{unsignedshortsa_family;/*Internet地址簇,AF_INET*/
charsa_data[14];/*目标地址和端口信息*/
};
(2)INET协议簇地址结构sockaddr_in,便于访问
structsockaddr_in{
unsignedshortsin_family;/*取AF_INET*/
unsignedshortsin_port;/*端口号,网络字节顺序*/
structin_addrsin_addr;/*IP地址,网络字节顺序*/
unsignedcharsin_zero[8];/*使用bzero()或memset()全部置0,*/
};
注:
指向sockaddr_in的指针和指向sockaddr的指针可互换使用。
(3)32位IPv4地址结构in_addr
structin_addr{unsignedlongs_addr;};
4.地址转换函数:
htons()、htonl()、ntohs()、ntohl()、inet_addr()、inet_aton()、inet_ntoa()、gethostbyname()(*)
字节顺序的转换(网络字节顺序):
主机字节顺序:
数据在主机上存放的顺序,与CPU类型和操作系统有关
网络字节顺序:
数据在网络上传输的顺序,约定高位在先,故一般需要转换。
转换函数:
(h:
主机host,n:
网络network)
函数htons():
指HosttoNetworkShort
函数htonl():
指HosttoNetworkLong
函数ntohs():
指NetworktoHostShort
函数ntohl():
指NetworktoHostLong
[注]:
structsockaddr_in中sin_port和sin_addr需转换为网络字节顺序;
而sin_family不需转换,只被内核调用,不发送到网络,可以是本机字节顺序。
初始化一个AF_INET地址(*)
structsockaddr_inadr_inet;//定义变量adr_inet
intadr_len;
memset(&adr_inet,0,sizeof(adr_inet));//string.h中
//将地址结构adr_inet清0
adr_inet.sin_family=AF_INET;//确定域,从而确定地址族
adr_inet.sin_port=htons(0);//自动选择合适的端口号
adr_inet.sin_addr.s_addr=htonl(INADDR_ANY);
//自动填写所运行机器的IP地址
adr_len=sizeof(adr_inet);
InternetIP地址
网络地址,主机地址,网络掩码
例:
IP地址:
202.113.29.19
网络分类:
C类网
网络地址:
202.113.29.0
主机地址:
***.***.***.19
网络掩码:
255.255.255.0
广播地址:
202.113.29.255
处理IP地址:
需包含以下头文件:
arpa/inet.h、netinet/in.h、sys/socket.h
(1)点分十进制格式→网络地址
函数inet_addr()
原型:
unsignedlongintinet_addr(char*src)
例:
structsockaddr_inina;
ina.sin_addr.s_addr=inet_addr(“162.105.32.1”);
[注]:
(1)inet_addr()返回的地址已经是按照网络字节顺序的,不必调用htonl()。
(2)inet_addr()发生错误时返回-1,编程时需进行错误检查,如:
if((ina.sin_addr.s_addr=inet_addr(“162.105.32.1”))<0)
cout<<“AddressError!
”;
函数inet_aton()
原型:
intinet_aton(char*src,structin_addr*dst)
例:
structsockaddr_inina;
inet_aton(“162.105.32.1”,&ina.sin_addr);
(2)网络地址→点分十进制格式:
函数inet_ntoa()
原型:
char*inet_ntoa(structin_addrin)
例:
structsockaddr_inclient;
cout<<"yougotaconnectionfrom\n"
< [注]: inet_ntoa()的参数是structin_addr,而不是unsignedlong 域名服务(简称DNS,将域名转换为网络地址): 函数gethostbyname() 功能: 实现域名(或点分十进制)转换为网络地址 包含文件: #include 原型: structhostent*gethostbyname(char*name); 用到的数据结构: structhostent{ char*h_name;/*主机名*/ char**h_aliases;/*主机别名数组*/ inth_addrtype;/*返回地址类型,常为AF_INET*/ inth_length;/*地址长度,用字节数表示*/ char**h_addr_list;/*主机网络地址数组*/ }; #defineh_addrh_addr_list[0]/*网络字节顺序的IP地址*/ 例: structhostent*he; structsockaddr_inserver; he=gethostbyname(“”); server.sin_addr=*((structin_addr*)he->h_addr); 服务器端建立过程: 创建socket: socket() 绑定本机端口: bind() 监听端口: listen() 接受连接: accept() 连接的数据传输: send()和recv() 无连接的数据传输: sendto()和recvfrom() 关闭socket: close() 客户端建立过程: 创建socket: socket() 建立连接: connect() 数据传输: send()和recv() 关闭socket: close() 三.面向连接的socket编程 1.TCP协议工作原理 TCP协议双方通信过程: 获得对方的IP地址和端口号 在本地主机上选择一个IP地址和端口号 建立连接 传输数据 断开连接 建立TCP连接: 服务器首先执行连接操作,依次为socket、bind、listen、accept,然后服务器阻塞,等待客户端的连接。 客户端接着执行连接操作,依次为socket、connect。 同时客户端向服务器送一个SYN类型的数据段,其中包含客户端的序列号。 服务器接收到这个SYN数据段后,也发送一个SYN数据段,其中包含服务器的序列号和对上一SYN的确认。 客户端接收确认后,发送对服务器SYN的确认,完成客户端的连接。 服务器接收确认后,完成服务器的连接。 关闭TCP连接: 执行主动关闭的一方调用close函数关闭连接,发送FIN数据段请求关闭连接。 另一方执行被动关闭操作,接收到FIN后,发送确认,主动关闭方到被动关闭方的通道被关闭。 被动关闭方完成数据传输后,调用close函数关闭连接,发送FIN给主动方。 主动方接收FIN后,发送确认,被动关闭方到主动关闭方的通道也被关闭。 整个TCP连接关闭。 出现以下情况重发数据报 数据报丢失(传输过程中丢失,也可能发送速度大于接收方的处理速度而被接收方抛弃)。 数据报的应答信号在传输过程中丢失。 应答信号在超时时间后到达。 2.系统调用socket()、bind()、listen()、accept()、connect()、send()、recv()、close()和shutdown()(*) socket()创建一个套接字,得到socket描述符 原型: #include #include intsocket(intdomain,inttype,intprotocol); 说明: domain为协议簇和地址簇,取AF_INET type通信类型,为SOCK_STREAM、SOCK_DGRAM或SOCK_RAW protocol使用的协议,为IPPROTO_TCP或IPPROTO_UDP,若为0,自动选择。 返回值: 成功,返回socket描述符,否则,返回-1。 典型代码: #include #include … intsockfd; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {… exit (1); } … bind()把socket和地址关联并指明端口(服务器端) 原型: #include #include intbind(intsockfd,structsockaddr*my_addr,intaddrlen); 说明: sockfd: 套接字描述符,是socket()返回的值 my_addr: 本地套接字地址,指向structsockaddr的指针(或指向structsockaddr_in的指针),指定本地端口和网络地址。 addrlen: 本地套接字地址结构长度 返回值: 成功,返回0;否则,返回-1,并将errno置为相应的错误号(如所绑定的地址已被其他进程使用,此时errno的值为EADDRINUSE)。 典型代码: (*) #include #include #include #defineSERVER_PORT1234 intsockfd; structsockaddr_inmy_addr; … bzero(&my_addr,sizeof(my_addr)); /*还可使用memset()置0*/ /*memset(&my_addr,0,sizeof(my_addr));*/ my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVER_PORT); my_addr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sockfd,&my_addr,sizeof(my_addr))==-1){ … exit (1);} listen()监听客户端有无连接请求(服务器端) 原型: #include #include intlisten(intsockfd,intbacklog); 说明: sockfd套接字描述符,socket()返回值,即“监听套接字”描述符 backlog为队列中允许连接数目,大多数允许20,也可置为5-10 返回值: 成功,返回0;否则,返回-1,将errno置为相应错误号。 典型代码: #include #include intsockfd,BACKLOG=5; … if(listen(sockfd,BACKLOG)==-1){…exit (1);} accept()接受客户端的连接请求(服务器端) 原型: #include #include intaccept(intsockfd,structsockaddr*addr,int*addrlen); 说明: sockfd“监听套接字”描述符,是socket()返回的值 addr是指向structsockaddr的指针,接受连接的客户端的主机地址和端口号 addrlen被置为sizeof(structsockaddr) 返回值: 成功,返回非负整数代表新的套接字,即“连接套接字”;否则,返回-1,并将errno置为相应错误号,addr存放提出连接请求服务的主机的信息。 注: 一个服务器只产生一个“监听套接字”,但可产生多个“连接套接字”以服务多个客户,完成客户请求后,关闭“连接套接字”。 connect()客户端与服务器端建立连接(面向连接的客户程序) 原型: #include #include intconnect(intsockfd,structsockaddr*serv_addr,intaddlen); 说明: sockfd: 是socket()函数返回的套接字描述符 serv_addr: 是指向structsockaddr的指针,服务器端的主机地址和端口号 addlen: 远程地址结构的长度 返回值: 成功,返回0;否则,返回-1,并将errno置为相应的错误号。 典型代码: (*) #include #include #include intsockfd; structsockaddr_inserver_addr; … bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(SERVER_PORT); server_addr.sin_addr.s_addr=inet_addr(“127.0.0.1”); if(connect(sockfd,(structsockaddr*)(&server_addr), sizeof(structsockaddr))==-1) {…exit (1);} … send()和recv()用于流式socket的通信 原型: intsend(intsockfd,void*msg,intlen,intflags); intrecv(intsockfd,void*buf,intlen,intflags); 说明: sockfd: 套接字描述符,对服务器是accept()返回的“连接套接字”,对客户是socket()函数返回的“监听套接字”,即都是“对方”的套接字描述符。 msg: 指向包含传输信息的数据缓冲区(通用指针) buf: 指向包含接收信息的数据缓冲区(通用指针) len: 指明传送/接收数据缓冲区的大小 flags: 传输控制标志。 send中,0(常规),MSG_OOB(带外),MSG_DONTROUTE忽略路由;recv中,0(常规),MSG_OOB(带外),MSG_PEEK(只看不读),MSG_WAITALL(缓冲区满返回) 返回值: 成功,返回发送/接收数据长度;否则返回-1,并将errno置为相应错误号。 典型代码: #include #include #defineMAXDATASIZE100 intsockfd,recvbytes; charbuf[MAXDATASIZE]; … while((recvbytes=recv(sockfd,buf,MAXDATASIZE,0))>0) {… buf[recvbytes]=0;/*接收的数据不包括结束标志*/ … } … close()和shutdown()关闭socket描述符或关闭通信 原型: close(sockfd); intshutdown(int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复习 范围 要求
![提示](https://static.bdocx.com/images/bang_tan.gif)