系列文章目录
第二章计算机网络之网络应用计算机网络之网络应用
一、P2P原理和文件分发
P2P比较复杂难管理
1.文件分发:客户机/服务器与P2P
问题
每个文件大小F
客户机服务器架构
F/min(di)下载最慢的结点
P2P架构
任何结点只要持有文件的任何部分就可以分享给其它结点
NF/(US+UI)是所有结点都上网传文件这是下载最快的方式
对比结果
所有文件分发下载用P2P
2.文件分发:BitTorrent协议
稀缺优先:你缺的只有3个结点能提供,另一些块有100个结点提供,先获取3个结点提供的块,因为3个结点可能随时离开。
发送:会给四个给自己发送并且速度最快的4个发块chunk,由于网络是动态变化的,所以每10s评估一次。
你给别人发送的越快,你越容易被别人发送文件
二、P2P应用_索引
1.P2P:搜索信息
2.集中式索引以及它的缺点
3.(分布式)洪泛式查询:Query flooding
问题:各自负责各自的索引,导致无法查询很大网络内的内容。如:全网搜索电影
所以有覆盖网络
4.层次式覆盖网络
5.P2P案例应用:skype
普通结点和普通结点之间通话是通过直接P2P(直接通信),索引才通过超级结点
# 二、Socket编程-Socket API概述
服务器先运行,客户后运行主动通信
服务器提供邮箱、WEB服务
对内管理
三、Socket编程-应用编程接口(API)
1.网络程序设计接口
网络应用程序设计针对的是端系统
在网络边缘上用户主机开发应用,不包括路由器这类
编程主要是Socket
2.应用编程接口(API)
3.几种典型的应用编程接口
四、Socket编程-Socket API概述
服务器先运行,客户后运行主动通信
服务器提供邮箱、WEB服务
对内管理
1.Socket抽象
操作系统会返回套接字描述符
每个进程创建一个Socket描述表,每个API(套接字)添加一个入口,每个入口有个指针指向Socket数据结构
数据结构中重要的信息是端点地址,IP+端口号也叫端点地址
因为通信要使用本地和远端的地址
2.地址结构
Socket套接字可以适合多种协议栈,不同协议栈的端点地址可能不同,TCP/IP是IP+端口号,不同协议地址族写法不一样。
如果是TCP/IP协议的话,地址族设置为AF_INET
五、Socket编程-Socket API函数(WinSock为例)
没有WSA开头的函数是通用可以window linux unix 使用
调用WSAStartup函数,初始化动态连接库
调用WSACLeanup函数,清除动态连接库
1.WSAStartup函数
2.WSACLeanup函数
3.socket函数
套接字描述符对应该t箭头指向的那个socket
4.Socket面向TCP/IP的服务类型
对于SOCK_RAW的创建需要root权限
TCP和UDP协议给应用层提供的服务的特点
可靠:数据不遗漏(数据一致)点对点:一个TCP连接只能连接两者,不能连接第三方
5.Closesocket函数
在linux unix 是Close
当多个应用进程共享一个Socket时,socket的数据结构会有个量存Socket引用次数,一个进程调用Closesocket,首先是在这个进程的套接字描述列表里面,把套接字描述符清除掉,不一定关闭这个描述符列表对应的套接字数据结构,释放它所占用的空间。
如果减到0,意味着没有其他进程在共享,才关闭。
一个进程里的线程Closesocket,无论是否套接字是否物理上释放掉。其他线程都无法访问
6.bind函数
场景:
主机有两个网络接口,比如两个网卡,分别连接在两个网络上(路由器)这两个网络接口有IP地址1和2
在该主机运行一个服务器
该服务器绑定Ip地址?绑定1,从ip2来的请求无法提供服务。
服务器:所以在设置Bind函数绑定端点地址时,设置端口号(数值端口号或者其他端口号)后Ip地址要设置地址通配符-----意味着在该服务器运行的主机上任意一个有效地址都行
7.listen函数
队列缓存是先进先出的
8.connect函数
UDP:UDP协议是无连接的,不会因为用了套接字API的connect函数在udp发生连接,作为UDP调用了,只是指定了端点地址。
TCP调用connect成功函数返回,客户与服务器连接成功。
UDP调用connect成功函数返回,客户与服务器不一定连接成功,因为没有连接。
9.accept
消息到应用进程后
为客户提供服务的也是新的套接字
由于TCP连接是点对点的,如果不创建新的套接字,则服务器只能为一个客户端提供服务,不能实现多线程多进程并发的TCP服务器
10.send,sento函数
发送数据的函数
send没有指定数据的端点地址,所以已经有连接了
11.recv,recvfrom函数
接受数据的函数
12.setsockopt,getsockopt函数
套接字参数的设置
套接字选定参数的读取
六、Socket API函数小结
除了3.1和3.2是在windows下使用,其他函数在linux unix windows都能用
七、关于网络字节顺序
在osi参考模型中表示层完成数据的转换,当客户端和服务器的系统数据表示不一样的时候,转换
在5层模型时,没有表示层
这件事由这协议做
当我们为套接字API指定某些参数值,给本地用户看,要网络转换本地。网络同理
八、网络应用的Socket API(TCP)调用基本流程
无客户发送连接请求会阻塞,如果有客户来接受请求,然后再创建新的套接字。如果没有,则阻塞(等待)
客户端不用调用80绑定端点地址,操作系统默认帮忙填写了
九、客户端软件设计
1.解析服务器IP地址
2.解析服务器(熟知端口号)
3.解析协议号
4.TCP客户端软件基本流程
绿色表示:这件事在客户端要做,不需要设计时调用函数去完成。系统调用客户端某个socket时就完成了
5.发起通信一定是客户端,通信成功了,根据协议看谁先发网络信息。
5.UDP客户端软件基本流程
UDP客户端软件通信,一定客户端软件先和服务器发送通信数据。
6.客户端软件的实现-connectsock()
重点看之前学过的函数,理解
TCP和UDP都行
UDP
TCP
7.客户端软件实现-异常处理
异常退出也要调用WSACLean()
8.案例1访问DAYTIME服务的客户端(TCP)
recv循环:因为,TCP协议是流传输协议
8.案例2访问DAYTIME服务的客户端(UDP)
what daytime is it?和hello 一样主要是和服务器进行通信,因为UDP是无连接
UDP是数据报传送,发是发完整的,收也是收取完整的,服务器不可能发一个时间(数据量很小),分成诺干个数据报进行发送,所以收只要调用一次recv
TCP是循环收
十、Socket编程应用-服务器软件设计
1. 4种类型基本服务器
2.基于UDP服务器数据发送
无论循环还是并发的服务器
3.基于UDP的服务器如何获取客户端端点的地址
from提取客户端的端点地址,是个指针,指向客户端的缓存,缓存存的客户端的端点地址
4.循环无连接服务器基本流程
一次只处理一个请求,基于UDP无连接
创建UDP套接字
第4步完成,再回到第三步接受客户端的请求
5.循环面向连接服务器基本流程
6.并发无连接的服务器基本流程
主线程和子线程可以同时运行,就是子线程正在处理客户的请求时,主线程就接受客户请求,并且创建一个新的子线程。可以同时处理很多客户的请求。
7.并发面向连接服务器的基本流程
十一、服务器的实现
1. 服务器的实现-passivesock()
2. 服务器的实现-passiveudp()
3. 服务器的实现-passivetcp()
4.实例1无连接循环DAYTIME服务器
循环器服务器:无并发,单线程
5.实例2面向连接并发DAYTIME服务器
主线程是单向的,不与客户交互
—beginthread是创建新的线程