计算机网络之网络应用4

系列文章目录

第二章计算机网络之网络应用

计算机网络之网络应用


一、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是创建新的线程

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值