网络编程doc.docx
- 文档编号:25656443
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:19
- 大小:21.38KB
网络编程doc.docx
《网络编程doc.docx》由会员分享,可在线阅读,更多相关《网络编程doc.docx(19页珍藏版)》请在冰豆网上搜索。
网络编程doc
1.网络体系结构:
网络层次结构和每层所使用协议的集合。
2.应用层,传输层,网际层,网络接口层
Internet是以ARPANET网络为雏形建立的。
3.网络接口层:
负责将其上的网络层要发送出去的数据发送到其下面的物理网络,或接受由物理网络发送到该目标机的数据帧,并抽出IP数据报交给网络层。
网际层:
把源主机上的分组根据需要发送到互联网中的任何一台目标主机上。
传输层:
完成两台主机之间的通信,实质是两台主机对应进程之间的通信。
应用层:
提供面向用户的网络服务。
4.主机A和主机D通信,数据被送入主机A的协议栈中,然后从应用层开始依次通过协议栈的每一层,知道到数据被当作一串比特流送入物理网络,其中每一层对收到的数据都要增加一些首部信息,这个过程叫作shu7ju的封装。
目的主机D接受到数据流以后,又要从主机D的最低层协议开始,依次通过协议栈的每一层,知道数据被送到最高层应用层为止,接受方的每一层要对发送方对等层多加的数据头进行识别、提取和处理,这个过程叫作解封装。
物理层数据传输方式有:
模拟传输,数字传输。
常用的数字信号编码方式有:
NRZ码,DNRZ码,曼彻斯特码,差分曼彻斯特码。
数据编码:
是指将数据表示成适当的信号形式,以便数据的传输和处理。
在数据传输系统中,主要采用3种数据编码技术:
数字数据的模拟信号编码,数字数据的数字信号编码,模拟数据的数字信号编码。
5数据传输的介质:
同轴电缆,双绞线,光缆。
无线传输。
6.数据传输方式:
模拟传输,数据传输。
7.数据通信的方式:
单工通信,半双工通信,全双工通信。
8.信道复用技术:
频分多路复用技术,时分多路复用技术,光波分多路复用技术。
9.数据链路:
传输数据时,除了必须要有的一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
10.差错检验与校正:
奇偶校验,方块校验,循环冗余校验。
11.路由器的功能:
路由和转发。
12.IP数据报格式:
1.版本号,占用4为二进制,2.头长度,用4位二进制,3.服务类型,用8位二进制,对数据报的处理方式,4.总长度,用16位二进制数表示,5.生存时间,用8位二进制数表示,6.上层协议标识,用8位二进制数表示,7.校验和,用16位,8.源地址,用23位,9.目的地址,用32位。
13.不产生ICMP差错报文:
(1)ICMP报文发生差错,这是为了避免差错报文无休止产生而规定的,
(2)目的地址是广播地址或多播地址的IP数据报,(3)作为链路层广播的数据报(4)不是IP分片的第一片,(5)源地址不是单个主机的数据报,就是说,源地址不能为零地址、回送地址,广播地址或多播地址。
14.ICMP报文类型:
目标不可达,重定向,超时,参数出错。
15.路由选择算法:
(1)路由器从收到的IP数据报中提取出目标IP地址,
(2)搜索路由表,寻找能与目的IP地址完全匹配的表目,如果能找到,就把报文发送给该表目指定的下一站路由器或者直接的网络接口,如果找不到,搜索路由表,把目标IP地址与子网掩码逐位“与”后找能与网络号想匹配的表目,如果能找到,就把报文发送给该表目指定的下一站路由器或直接连接的网络接口,如果找不到,就搜索路由表,寻找为“默认”的表目,把报文发送给指定的下一站路由器,如果找不到,就发送一个“目标不可达”的ICMP报文给源主机。
16.主机A发送ARP请求,请求帧中数据部分包括,发送者的MAC地址,IP地址,目标IP地址,目标的MAC地址是广播地址,所有的网络中的主机都可以打开,只有符合目标IP地址的主机才回答ARP请求,把自己的MAC地址写入,目标地址字段中发送给主机A,ARP请求者在自己的缓存中构建一个ARP表,将地址信号缓存起来。
17.端口的功能:
识别传输层上不同的网络通信程序。
18.TCP提供的是可靠的,有链接的服务,协议复杂,其拥塞控制,数据校验,重传机制的网络开销很大,不适合实时通信,UDP提供无连接,不可靠的,协议简单,高效的传输数据,适合数据传输量小的场合。
19.UDP:
无连接,不可靠,面向报文。
TCP:
连接,可靠的,面向字节流。
20.网络工作模式:
C/S模式,B/S模式,混合模式。
21.主机,先向本地域名服务器查询,要是没有就查询高速缓存查询,要是没有就向根域名服务器查询,在向顶级域名服务器查询,在向权限域名服务器查询返回给主机。
22.网络登录协议,指定不同的端口访问其他服务器。
23.万维网工作过程:
(1)用户受限要确定网页文件所在的URL,由ULR唯一确定用户要访问的文件在Internert上的位置,
(2)浏览器向DNS发送请求,把域名转换成对应的IP地址(3)DNS进行查询后,向浏览器发送出应答,(4)在查得到的网页躲在的服务器IP地址后,就进入HTTP的工作阶段,浏览器向服务器IP地址的主机发出与端口80建立一条TCP链接(5)链接建立成功后,浏览器发送一条请求传出网页的HTTP命令,(6)服务器接受到请求后,向浏览器发送文件,(7)文件发送完了,服务器主动关闭TCP链接,(8)浏览器显示收到的网页文件(9)要是文件中包含有图片,还要与服务器建立TCP链接下载图片。
24.URL=协议名称+主机名(或IP地址)+目录与文件名
25.控制链接:
<客户端IP地址,客户端控制链接端口,服务器端IP地址,FTP服务器控制链接端口21>
数据链接:
<客户端IP地址,客户端控制链接端口,服务器端IP地址,FTP服务器控制链接端口20>
26.网络中两个通讯程序相互识别对方:
在网络中位了标识通信的进程,首先要标识网络中进程所在的主机,在互联网中使用IP地址来标识不同的主机,其次要标识主机上不同的进程,主机上不同的进程问题,在网络协议中使用端口号来标识主机上的不同进程。
由于不同的主机可能使用不同的网络协议,工作方式不同,地址的标识格式不同,用五元组来标识连两个通信的进程(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)。
27.五元组:
协议,本地IP地址,本地端口号,远程IP地址,远程端口号。
28.套接口可以看成是两个网络应用程序进程通信时,各自通信连接中的一个端点。
流式套接口SOCK_STREAM提供了一种可靠地、面向连接的双向数据传输服务,实现了数据的无差错,无重复的发送,内设流量控制,被传输的数据看作是无记录边界的字节流
数据报套接口SOCK_DGRAM提供一种无连接、不可靠的双向数据传输服务,数据报以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证。
原始套接口SOCK_RAW该套接口允许对较低层协议进行直接访问。
29.网络字节顺序保证数据的正确性。
Htonl()和WSAHtonl()参数是主机字节顺序4个字节
htons()和WSAHtons()参数是主机字节顺序2个字节。
30.网络程序要考虑的几个问题:
(1)并发环境下的网络编程,
(2)异构环境下的网络编程(字节顺序、字的长度、字节定界问题)(3)阻塞与非阻塞通道(4)服务类型的选择
31.加载协议栈intWSAStartup(WORDwVersionRequested,LPWSADATAipWASData)第一个指定Winsock库的版本号。
第二个参数是一个指向WSADATA结构的指针。
创建套接口SOCKETsocket(intaf,inttype,intprotocol);af说明套接口使用的协议地址族TCP或UDP。
Type套接口的类型,protocol套接口使用的特定协议,如果不指定课设置为0。
NULL,0。
地址绑定intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen)S标识一个未绑定套接口的描述字,name是一个与指定协议有关的地址结构指针,
sin_family字段必须为AF_INET。
服务器端监听连接intlisten(SOCKETs,intbacklog)S标识一个已绑定了地址,但还未建立套接口,backlog指定了正在等待连接的最大队列长度。
Listen()仅适用于连接的套接口
客户端请求连接intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen)
s指将要建立连接的套接口name是一个指向远端套接口地址结构namelen标识name名字的长度。
服务器端接受连接SOCKETaccept(SOCKETs,structsockaddrFAR*addr,
intFAR*addrlen)s标识一个套接口,处于连接状态,addr存放发送连接请求的客户机的IP地址信息,addrlen客户地址结构的长度。
有链接的数据发送intsend(SOCKETs,constcharFAR*buf,intlen,intflags)
S用于标识已建立连接的套接口,buf字符缓冲区,内有将要发送的数据,len将要发送的缓冲区中的字符数,flags用于控制数据传输方式,它可以是0,MSG_DONTROUTE或MSG_OOB,0表示按正常方式发送数据。
有链接的数据接收intrecv(sockets,charFAR*buf,intlen,intflags)
S标识已建立连接的套接口,buf用于接收数据的缓冲区,len缓冲区长度,flags指定调用方式,flags参数可以是0,MSG_PEEK或MSG_OOB,0表示正常数据。
无连接的数据接收intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,
structsockaddrFAR*from,intFAR*fromlen)s标识一个套接口,buf接收数据缓冲区,len缓冲区长度,flags调用方式,from指向存有源地址的缓冲区,fromlen指向from缓冲区长度值,
无连接数据发送intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen)s标识套接口,buf待发数据的缓冲区,len指明buf缓冲区中要发送的数据长度,flags调用方式标志位,to指针,指向接收数据的目的套接口的地址,tolen:
to所指地址的长度。
TCP:
服务器
#include
#defineDEFAULT_PORT5050
#pragmacomment(lib,"WS2_32.lib")
voidmain()
{
intiPort=DEFAULT_PORT;
WSADATAwsaData;
SOCKETsListen,sAccept;
intiLen;
intiSend;
charbuf[]="Iamaserver.";
structsockaddr_inser,cli;
printf("--------------\n");
printf("Serverwaiting\n");
printf("--------------\n");
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{
printf("FailedtoloadWinsock.\n");
return;
}
//创建服务器端套接口
sListen=socket(AF_INET,SOCK_STREAM,0);
if(sListen==INVALID_SOCKET)
{
printf("socket()Failed:
%d\n",WSAGetLastError());
return;
}
//一下建立服务器端地址
ser.sin_family=AF_INET;
ser.sin_port=htons(iPort);
ser.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR)
{
printf("bind()Failed:
%d\n",WSAGetLastError());
closesocket(sListen);
return;
}
//进入监听状态
if(listen(sListen,5)==SOCKET_ERROR)
{
printf("listen()Falied:
%d\n",WSAGetLastError());
return;
}
//初始化客户端地址长度参数
iLen=sizeof(cli);
//进入一个无限循环,等待客户的链接请求
while
(1)
{
sAccept=accept(sListen,(structsockaddr*)&cli,&iLen);
if(sAccept==INVALID_SOCKET)
{
printf("accept()Failed:
%d\n",WSAGetLastError());
break;
}
//输出客户IP地址和端口号
printf("AcceptedclientIP:
[%s],port:
[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
//给建立连接的客户端发送信息
iSend=send(sAccept,buf,sizeof(buf),0);
if(iSend==SOCKET_ERROR)
{
printf("send()Failed.:
%d\n",WSAGetLastError());
break;
}
elseif(iSend==0)
break;
else
{
printf("send()byte:
%d\n",iSend);
printf("--------------");
}
closesocket(sAccept);
}
closesocket(sListen);
WSACleanup();
}
TCP客户端
#include"stdafx.h"
#include
#include
#include
#defineDEFAULT_PORT5050
#defineDATA_BUFFER1024
#pragmacomment(lib,"WS2_32.lib")
voidmain(intargc,char*argv[])
{
WSADATAwsaData;
SOCKETsClient;
intiPort=DEFAULT_PORT;
//从服务器端接收的数据长度
intiLen;
//接收数据的缓冲
charbuf[DATA_BUFFER];
//服务器端地址
structsockaddr_inser;
//判断输入的参数是否正确
/*if(argc<2)
{
//提示在命令行中输入服务器IP地址
printf("Usage:
client[serverIPaddress]\n");
return;
}*/
//接收数据的缓冲区初始化
memset(buf,0,sizeof(buf));
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{
printf("FailedtoloadWinsock.\n");
return;
}
//填写要连接的服务器地址信息
ser.sin_family=AF_INET;
ser.sin_port=htons(iPort);
ser.sin_addr.s_addr=inet_addr("127.0.0.1");//"127.0.0.1"argv[1]
//建立客户端流式套接口
sClient=socket(AF_INET,SOCK_STREAM,0);
if(sClient==INVALID_SOCKET)
{
printf("socket(0Failed:
%d\n",WSAGetLastError());
return;
}
//请求与服务器端建立TCP连接
if(connect(sClient,(structsockaddr*)&ser,sizeof(ser))==INVALID_SOCKET)
{
printf("connect()Failed:
%d\n",WSAGetLastError());
return;
}
//输入字符
else
{
while
(1)
{
//memset(buf,0,sizeof(buf));
printf("输入字符\n");
cin>>buf;
intiSend=send(sClient,buf,sizeof(buf),0);
if(iSend==SOCKET_ERROR)
{
printf("send(0Failed.:
%d\n",WSAGetLastError());
break;
}
else
{
//从服务器端接收数据
iLen=recv(sClient,buf,sizeof(buf),0);
if(iLen==0)
return;
elseif(iLen==SOCKET_ERROR)
{
printf("recv()Failed:
%d\n",WSAGetLastError());
return;
}
printf("recv()datafromserver:
%s\n",buf);
}
}
}
closesocket(sClient);
WSACleanup();
}
UDP服务器
#include"stdafx.h"
#include
#include
#pragmacomment(lib,"WS2_32.lib")
//服务器端口号为5050
#defineDEFAULT_PORT5050
//接收数据缓冲区长度
#defineBUFFER_LENGTH1024
voidmain()
{
intiPort=DEFAULT_PORT;
WSADATAwsaData;
SOCKETsSocket;
//客户地址长度
intiLen;
//发送的数据长度
intiSend;
//接收数据长度
intiRecv;
//要发送给客户的信息
charsend_buf[]="Hello!
Iamaserver.";
//接收数据的缓冲区
charrecv_buf[BUFFER_LENGTH];
//本地地址和客户地址
structsockaddr_inser,cli;
printf("---------------------------\n");
printf("Serverwaiting\n");
printf("---------------------------\n");
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{
printf("FailedtoloadWinsock.\n");
return;
}
//产生服务器端套接口
sSocket=socket(AF_INET,SOCK_DGRAM,0);
if(sSocket==INVALID_SOCKET)
{
printf("socket()Failed:
%d\n",WSAGetLastError());
return;
}
ser.sin_family=AF_INET;
//htons()函数把一个双字节的主机字节顺序数转换为网络字节顺序
ser.sin_port=htons(iPort);
//htonl()函数吧一个主机自己顺序的数转换为网络字节顺序
ser.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR)
{
printf("bind()Failed:
%d\n",WSAGetLastError());
return;
}
iLen=sizeof(cli);
//初始化接收缓冲区
memset(recv_buf,0,sizeof(recv_buf));
//进入一个无限循环,进行数据接收和发送
while
(1)
{
//从客户端接收数据
iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);
if(iRecv==SOCKET_ERROR)
{
printf("recvfrom()Failed.:
%d\n",WSAGetLastError());
break;
}
elseif(iRecv==0)
break;
else
{
//输出接受到的数据
printf("recvfrom():
%s\n",recv_buf);
//输出客户IP地址和端口号
printf("AcceptedclientIP:
[%s],port:
[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
}
//给客户发送信息
iSend=sendto(sSocket,send_buf,sizeof(send_buf),0,(SOCKADDR*)&cli,sizeof(cli));
if(iSend==SOCKET_ERROR)
{
printf("sendto(0Failed.:
%d\n",WSAGetLastError());
printf("---------------------------\n");
break;
}
elseif(iSend==0)
break;
else
{
printf("sendto()succceeded!
\n");
printf("---------------------------\n");
}
}
closesocket(sSocket);
WS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 doc