




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1. 基本概念1.1. 什么是协议计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。1.2. TCP/IP协议的四层体系结构应用层(Telnet、FTP、HTTP、DNS、SNMP、SMTP)传输层(TCP、UDP)网络层(IP、ICMP、IGMP)链路层(以太网、令牌环网、FDDI、IEEE802.3)1.3. IP地址的结构、分类、多播(或称组播)目前使用的IP协议为ipv4(即IP协议的第四版),使用32位二进制表示结构:网络号主机号分类:A,B,C,D,E等五类地址,见下表类别类标识地址范围第一字节网络地址长度最大网络数最大主机数选用范围A类011261字节12616777214大型网络B类101281912字节1638265534中型网络C类1101922233字节2097150254小型网络D类111055224239多点播送E类11110240247保留地址直接广播地址:主机号为全1的IP地址;多播:1) 一对多的通信,一个源点发送到多个终点;2) 标识一个多播的标识符即为一个D类地址;3) 使用IGMP(网际组管理协议)协议,首部的协议字段值为24) 多播地址只能用于目的地址,不能用于源地址;5) 对多播数据报不产生ICMP差错报文;多播分两种:局域网范围的硬件多播;因特网范围的多播,因为大部分主机是通过局域网接入到因特网的,因此在多播的最后阶段,还是要在局域网范围内进行硬件多播。1.4. 多播(或称组播)IP地址,如何映射到MAC地址组播IP地址,即D类地址,范围是55;MAC地址的前25位是固定的,后23位与IP地址的后23位相同IP地址1110 yyyyyxxx xxxxxxxx xxxxxxxx xxxxMAC地址0000 00010000 00000101 11100xxx xxxxxxxx xxxxxxxx xxxx(16进制)0 10 05 e1.5. 标识网络中的两个通信的进程或一条连接五元组(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)1.6. socket(套接字)的三种协议类型及其应用场合socket(int af, int type, int protocol)函数中,当第二个参数为AF_INET时,第三个参数type的值可以为:SOCK_STREAM(流式套接字)、SOCK_DGRAM(数据报套接字)、SOCK_RAW(原始套接字),详情见下表:协议类型应用场合socket函数中的protocol值SOCK_STREAMTCPIPPROTO_TCPSOCK_DGRAMUDPIPPROTO_UDPSOCK_RAWraw socketsIPPROTO_ICMP1.7. 写代码:创建socket1) TCPSOCKET tcpSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);2) UDPSOCKET udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);3) 原始套接字SOCKET icmpSocket = socket(AF_INET, SOCK_RAM, IPPROTO_ICMP);1.8. TCP的C/S通信模型WSAStartup()socket()bind()listen()accept()send()/recv()closesocket()WSACleanup()WSAStartup()socket()connect()closesocket()WSACleanup()ServerClient初始化winsock创建socketsocket与本地ip、端口绑定监听客户端的连接接受客户端的连接关闭socket释放winsock资源建立与服务器的连接send()/recv()1.9. UDP的C/S通信模型WSAStartup()socket()bind()sendto()/recvfrom()closesocket()WSACleanup()WSAStartup()socket()closesocket()WSACleanup()ServerClient初始化winsock创建socketsocket与本地ip、端口绑定关闭socket释放winsock资源sendto()/recvfrom()bind()1.10. 服务器端的两种绑定方式的区别IP地址端口参数方式1INADDR_ANY非0值所有网卡都可接收连接,所有人都可连接方式2IP地址非0值某网卡接收,指定人群连接函数bind原型为:int bind(SOCKET s, const struct sockaddr *name, int namelen)代码如下:SOCKET listenSocket;struct sockaddr_in service;listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);/绑定方式1:service.sin_port = htons(9999);service.sin_addr.s_addr = inet_addr(INADDR_ANY);/绑定方式2:service.sin_port = htons(9999);service.sin_addr.s_addr = inet_addr();bind(listenSocket, (SOCKADDR *) &service, sizeof(service);1.11. 函数listen中第二个参数的含义函数原型为:int listen(SOCKET s, int backlog);第二个参数backlog:设置等待连接队列的最大长度,若设置为SOMAXCONN,则表示可用的最大长度。1.12. 在网络通信中,怎样传输一个字符串(可能含有汉字)统一字符编码为UTF-8,传输时,先传输字符串的长度,再传输字符串内容。2. 程序设计2.1. 写代码:两个线程,交替打印数字步骤:WSAStartup(),初始化winsocksocket(),创建TCP型的socketbind(),绑定服务器的IP、PORTlisten(),监听socketwhile (continue) accept(),接收客户端的连接 创建新线程,传入通信用的socket,与客户端进行通信closesocket(),关闭socketWSACleanup(),释放winsock资源代码:/* * main.cpp* 多线程程序 * 两个线程,分别打印线程号+数字 */#include #include #include unsigned int CALLBACK myThread(void *p);int main() HANDLE handles2; handles0=(HANDLE)_beginthreadex(NULL, 0, myThread, NULL, 0, NULL); handles1=(HANDLE)_beginthreadex(NULL, 0, myThread, NULL, 0, NULL); WaitForMultipleObjects(2, handles, true, INFINITE); CloseHandle(handles0); CloseHandle(handles1); return 0;unsigned int CALLBACK myThread(void *p) for(int i = 1;i = 10;i+) printf(Thread:%u 打印:%dn, GetCurrentThreadId(), i); Sleep(2000); return 0;程序截图:2.2. 程序设计步骤:多线程TCP服务器端程序步骤:WSAStartup(),初始化winsocksocket(),创建TCP型的socketbind(),绑定服务器的IP、PORTlisten(),监听socketwhile (continue) accept(),接收客户端的连接 创建新线程,传入通信用的socket,与客户端进行通信closesocket(),关闭socketWSACleanup(),释放winsock资源代码:/* * 多线程TCP服务器端程序 */#include #include #include #pragma comment(lib, ws2_32)/线程:处理一个客户机的网络通信。unsigned int CALLBACK tcpThread(void *p);int main() int iResult; WORD wVersionRequested; WSADATA wsaData; SOCKET listenSocket; SOCKET acceptSocket; struct sockaddr_in service; HANDLE handles10; wVersionRequested = MAKEWORD(2, 2); /* Initializing Winsock */ iResult = WSAStartup(wVersionRequested, &wsaData); if (iResult != 0) printf(WSAStartup failed with error: %dn, iResult); return -1; /* create a tcp socket */ listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listenSocket = INVALID_SOCKET) printf(create socket falied with error: %dn, WSAGetLastError(); WSACleanup(); return -1; /* bind the socket */ service.sin_family = AF_INET; service.sin_port = htons(9999); service.sin_addr.s_addr = inet_addr(); iResult = bind(listenSocket, (SOCKADDR *) &service, sizeof(service); if (iResult = SOCKET_ERROR) printf(bind failed with error:%dn, WSAGetLastError(); closesocket(listenSocket); WSACleanup(); return -1; /* listen for incoming connection requests */ iResult = listen(listenSocket, SOMAXCONN); if (iResult = SOCKET_ERROR) printf(listen failed with error:%dn, WSAGetLastError(); closesocket(listenSocket); WSACleanup(); return -1; printf(listening on socket.n); /* accept new incoming connections */ int again = 0; while (again 10) struct sockaddr_in client_addr; int client_addr_size = sizeof(client_addr); SOCKET clientSock = accept(listenSocket, (struct sockaddr *) &client_addr, &client_addr_size); if (clientSock != INVALID_SOCKET) closesocket(listenSocket); WSACleanup(); return -1; handlesagain = (HANDLE)_beginthreadex(NULL, 0, tcpThread, (void *)clientSock, 0, NULL); again+; WaitForMultipleObjects(10,handles, TRUE, INFINITE); for(int i = 0; i 10; i+) CloseHandle(handlesi); closesocket(listenSocket); WSACleanup(); return 0;/线程:处理一个客户机的网络通信。unsigned int CALLBACK tcpThread(void *p) SOCKET client = (SOCKET) p; /* do something: * recv()/send() */ return 0;2.3. 程序设计步骤:UDP多循环服务器程序步骤:WSAStartup(),初始化winsocksocket(),创建UDP型的socketbind(),绑定服务器的IP、PORTwhile (continue) recvfrom(),接收UDP包 sendto(),发送UDP包closesocket(),关闭socketWSACleanup(),释放winsock资源代码:/* * UDP Server */#include #include #pragma comment(lib, ws2_32)int main() WSAData wsaData; WORD wVersionRequested; int iResult; struct sockaddr_in service; SOCKET listenSocket; wVersionRequested = MAKEWORD(2, 2); iResult = WSAStartup(wVersionRequested, &wsaData); if (iResult != 0) printf(WSAStartup failed with error: %dn, iResult); return -1; listenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (listenSocket = INVALID_SOCKET) printf(create socket failed with error: %dn, WSAGetLastError(); WSACleanup(); service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr(); service.sin_port = htons(9999); iResult = bind(listenSocket, (SOCKADDR *) &service, sizeof(service); if (iResult = SOCKET_ERROR) printf(bind failed with error:%dn, WSAGetLastError(); closesocket(listenSocket); WSACleanup(); return -1; struct sockaddr_in client_addr; int len = sizeof(client_addr); while(1) /* do something: * recvfrom() * sendto() */ closesocket(listenSocket); WSACleanup(); return 0;2.4. 连接型UDP一般用于哪一方?什么场合?一般用于客户端;要求内核进行UDP包的过滤;2.5. 广播程序,每隔3秒广播本地时间步骤:WSAStartup(),初始化winsocksocket(),创建socketsetsockopt(),允许广播while (continue) getCurrentTime(),获取本地时间 sendto(),发送数据 Sleep(),暂停3秒closesocket(),关闭socketWSACleanup(),释放winsock资源代码:/* * 广播服务器端程序 * 每3秒广播服务器端的时间 */#include #include #include #pragma comment(lib, ws2_32)void getcurtime(char* curtime) time_t tm;/time.h time(&tm);/time.h sprintf(curtime, %sn, ctime(&tm);int main() int iResult; WORD wVersionRequested; WSADATA wsaData; SOCKET serverSocket; struct sockaddr_in service; char on = 1; char msg256; serverSocket = socket(AF_INET, SOCK_DGRAM, 0); setsockopt(serverSocket, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on); /允许发广播包 service.sin_family = AF_INET; service.sin_port = htons(9999); service.sin_addr.s_addr = htonl(INADDR_BROADCAST); while (1) getcurtime(msg); sendto(serverSocket, msg, strlen(msg), 0, (sockaddr *)&serverSocket, sizeof(serverSocket); printf(%sn,msg); Sleep(3000);/* sleep 3 seconds between send */ closesocket(serverSocket); WSACleanup(); return 0;2.6. 多播(或称组播)程序,每隔3秒多播本地时间步骤:WSAStartup(),初始化winsocksocket(),创建socketsetsockopt(),允许广播while (continue) getCurrentTime(),获取本地时间 sendto(),发送数据到某D类地址 Sleep(),暂停3秒closesocket(),关闭socketWSACleanup(),释放winsock资源代码:/* * 多播服务器端程序 * 每3秒广播服务器端的时间 */#include #include #include #pragma comment(lib, ws2_32)void getcurtime(char* curtime) time_t tm;/time.h time(&tm);/time.h sprintf(curtime, %sn, ctime(&tm);int main() int iResult; WORD wVersionRequested; WSADATA wsaData; SOCKET serverSocket; struct sockaddr_in service; char on = 1; char msg256; serverSocket = socket(AF_INET, SOCK_DGRAM, 0); setsockopt(serverSocket, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on); /允许发广播包 service.sin_family = AF_INET; service.sin_port = htons(9999); service.sin_addr.s_addr = inet_addr(); printf(每3秒向组发包,告之本机的时间n); while (1) getcurtime(msg); sendto(serverSocket, msg, strlen(msg), 0, (sockaddr *)&serverSocket, sizeof(serverSocket); printf(%sn,msg); Sleep(3000);/* sleep 3 seconds between send */ closesocket(serverSocket); WSACleanup(); return 0;3. 协议分析3.1. IP数据报头部最大/小长度、头部选项最大/小长度,最多记录路由个数头部最小长度:20 Bytes头部最大长度:60 Bytes选项最小长度: 0 Bytes选项最小长度:40 Bytes最多记录路由: 9 个3.2. 程序设计步骤:MyPing (源主机发送类型为8代码为0的“回送请求报文”,当目标主机收到该报文时,将标识符、序号、数据区复制以组成类型为0代码为0的“回送应答报文”,发送给源主机。)1) 创建原始套接字;2) 设置套接字的超时选项(如6秒);3) 构造ICMP数据报:类型为8代码为0回送请求;4) 构造IP数据报,将上述的ICMP数据报作为IP数据报的数据部分;设置超时选项;5) 发送IP数据报到目标IP地址、端口;6) 若收到目标主机的类型为0代码为0的回头应答报文,则表示目标地址、端口号可达;3.3. 程序设计步骤:路由MTU发现1) 创建原始套接字(ICMP协议);2) 打开选项;3) 构造IP报文:4) 填写头部:报文头部长度设置为最大,不允许分片;5) 填写数据:TCP数据报;当路由器发现报文长度太长,需要分片,但报文头部设置为不允许分片,则路由器丢弃该报文,并发送ICMP报文给源主机;本地收到ICMP报文后,将报文长度设置为收到的ICMP报文长度,再次重新发送IP数据报。直到源主机收到来自目的主机的TCP确认报文,最后一次发送的报文长度就是该路径的MTU。3.4. 程序设计步骤:记录两主机之间经过的路由1) 创建原始套接字;2) 打开记录路由选项:选项类为0;选项号为7;选项长度为39;指针初值为4;初始时,指针指向存放第一个IP地址的位置,经过各路由器时,存入每个路由器的IP地址,指针的值每次加4;最多可存放9个IP地址;3.5. 程序设计步骤:FTP断点续传1) USER 用户名2) PASS 口令3) TYPE I(文件类型:二进制)4) FILE F(文件的数据结构:文件结构)5) MODE S(文件的传输方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学一年级上册-北师大版数学期中试卷(二)
- 全国学生竞赛试题及答案
- 妇女保健试题及答案高一
- 布艺温馨面试题目及答案
- 2024年纺织工程的基础知识试题及答案
- 2024年设计理论国际商业美术设计师考试试题及答案
- 商业AIGC擎舵-数字人
- 2024年广告设计师设计市场调研试题及答案
- 功能性纺织品的设计试题及答案
- 天津市专升本试题及答案
- 部编版语文六年级下册第四单元 复习课件
- 常用试敏药品操作规程表
- 学位论文写作及其学术规范课件
- 022旋翼干式塑料表壳水表
- 特殊旅客的航空服务文献综述
- 实验模式动物斑马鱼左正宏
- 小学后进生转化记录表4篇-后进生转化
- 钢箱梁运输与安装施工方案
- DDI辅导员工迈向成功-辅导领导力系列
- 兼职教师任职承诺书
- 上海市2020年中考化学试卷(word版含解析)
评论
0/150
提交评论