计算机网络——哈工大
计算机网络——哈工大
HTTP协议
HTTP1.1 是一种 不保存状态,即无状态协议。对于发送的请求和响应都不做持久化处理。
这主要是为了 更快的处理大量的事务,确保协议的可伸缩性。
但是很多情况下,需要保存之前的状态,比如登录状态、购物网站的购物车等等。因此引入了Cookie 会话技术,用于管理状态。、
使用URI定位互联网上的资源。
HTTP中使用的方法;
GET方法 : 获取资源
用来请求访问已经被URI识别的资源。
POST: 传输实体主体
POST方法用来传输实体的主体(主要目的不是获取响应的主体内容)
PUT:传输文件
但是由于HTTP1.1的PUT方法自身不带验证机制,所以存在安全性问题。
往往需要配合Web应用程序的验证机制或架构采用REST标准同类的Web网站,即可
HEAD: 获得报文首部
用于确认URI的有效性及资源更新的日期时间等。
DELETE: 删除文件
与PUT方法相反,其是按请求URI删除指定的资源。注意: 同样不带验证机制。
OPTIONS: 询问支持的方法
用来查询针对请求URI指定的资源支持的方法。
TRACE: 追踪路径
让Web服务器端将之前的请求通信环回给客户端的方法。注意:容易引发XST攻击,一般就不会用到它。
CONNECT: 要求用隧道协议连接代理
与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
持久连接
在初始HTTP初始版本中,每进行一次HTTP通信就断开一次TCP连接
这会增加通信量的开销。
因此HTTP1.1 和部分的HTTP1.0 想出了持久连接的方法。
特点是 只要任意一端没有明确提出断开连接,则保持TCP连接状态。
减轻服务器端的负载,提高Web页面的显示速度。
管线化
持久化连接使得管线化方式发送成为可能。
以前,发送请求,等待收到响应后,才可以发送下一个请求。
现在,有了管线化技术,就不用等待响应也可以直接发送。
于是便可以同时并行发送多个请求。
Cookie 状态管理
为什么要引入Cookie技术呢?
Http是一种无状态协议,也就是说它不会对之前发生过的请求和响应的状态进行管理,使得无法根据之前状态进行新的请求处理。但是正因为Http协议为无状态协议,所以可以极大的减少服务器的CPU和内存的消耗。
基于这样的矛盾,就诞生了Cookie技术。
它通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
服务器端给客户端发送的响应报文中有一个叫做 Set-Cookie 的首部字段信息,Cookie技术会通知客户端保存Cookie。
于是,当下一次客户端向服务器端发送请求报文时,客户端会在请求报文中加入Cookie的值。
然后,服务端就会根据这个Cookie的值检查是哪一个客户端发来的请求,然后根据服务器上的记录得到之前的状态信息。
Http报文
Http报文:用于HTTP协议交互的信息,分为请求报文和响应报文,是HTTP通信中的基本单位,由8位组字节流组成。
分为报文首部和报文主体两大块。
请求报文格式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHcu29Mz-1641780660108)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109165207627.png)]
响应报文格式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gxa9B07o-1641780660111)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109165237461.png)]
请求行: 包含 用于请求的方法、请求的URI 和 HTTP版本
状态行:包含表明响应结果的状态码、原因短语和HTTP版本。
HTTP传输
HTTP在传输数据时,允许按照数据原貌传输,也可以通过在传输过程中通过编码提升传输速率,通过这种方式,能有效的处理大量的访问请求。但是编码由计算机来完成,需要消耗更多的CPU资源。
实体:
作为请求和响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
HTTP报文的主体用于传输请求或响应的实体主体。
一般,报文主体等于实体主体。但是当进行编码操作时,实体主体内容会发生变化。
Email 消息格式
RFC 822 : 文本消息格式标准
头部行
消息体
扩展:MIME 多媒体邮件扩展 RFC2054,2056
邮件访问协议
从服务器获取邮件
POP:Post Office Protocol
认证/授权和下载
IMAP
功能更多
HTTP
浏览器使用
POP协议
认证过程:
客户端命令
服务器响应
事物阶段:
“下载并删除”模式:
无法重读该邮件
“下载并保持”模式:
不同客户端都可以保留消息的拷贝
POP3是无状态的
IMAP协议
消息统一保存在服务器
DNS概述
在网络应用层应用的网络核心技术
Domain Name System 域名系统
分布式架构的数据库
解决Internet上主机/路由器的识别问题
IP地址
域名
IP地址与域名之间映射: 域名解析系统DNS
DNS服务:
域名翻译成 IP 地址
主机别名
邮件服务器别名
负载均衡:Web服务器
不用集中式的DNS
单点失败、流量问题、距离问题、维护性问题
DNS根域名服务器
当本地域名解析
本地域名服务器:缓存、更新IP映射
DNS协议:查询和回复
如何注册域名?
域名管理机构 注册域名
提供我的权威域名解析服务器的名字和IP地址
由域名管理机构向com顶级域名解析服务器插入两条记录
P2P应用
Peer to Peer
没有服务器
任意端系统之间直接通信
节点阶段性接入Internet
节点可能更换IP地址
复杂、难于管理
P2P架构 被广泛的应用于文件分发、下载,其所需要的时间非常的端,且随着用户的增多,时间趋于水平
但是C/S架构的时间确实线性的
其中文件分发采用 BitTottent 协议
BitTottent 协议 即P2P 会对带宽带来严重的挤占行为
P2P:索引技术
搜索信息
索引系统:信息到节点位置(IP地址+端口号)的映射
利用索引来查找IP
文件共享(如电驴)、即时消息(如QQ)
集中式索引:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G1LfnNab-1641780660114)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211218163517489.png)]
这种方式:
内容和文件传输是分布式的,但是内容定位是高度集中式的
故会存在单点失效问题、性能瓶颈、版权问题
分布式索引系统:
洪泛式查询
导致网络拥堵
层次式覆盖网络
介于集中式和洪泛查询之间的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7fdaCCg-1641780660115)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211218164439954.png)]
P2P案例应用:
Skype
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qy1kqOni-1641780660116)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211218164653776.png)]
Socket编程-应用编程接口(API)
套接字编程 介于 应用层和传输层之间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtP7dECo-1641780660117)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211219202245630.png)]
几种典型的应用编程接口
Socket API
网络应用程序开发的标准
应用进程间通信的抽象机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tyJxYEFU-1641780660118)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211219205420681.png)]
标识通信端点(对外):IP地址+端口号
操作系统/进程如何管理套接字(对内)?:套接字描述符
地址结构:sockaddr_in:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VO9T4JlU-1641780660118)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211219210339581.png)]
socket
创建套接字
操作系统返回套接字描述符
三个参数(协议族、套接字类型、协议号)
SOCK_DGRAM 面向UDP
SOCK_STREAM 面向TCP
SOCK_RAM 直接面向网络层
TCP:给应用提供服务:
可靠:不会丢失、乱序
面向连接
字节流传输
点对点
UDP:
不可靠
无连接
数据报传输
Closesocket 函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j9QfBWEN-1641780660120)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211220224612544.png)]
bind函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BANtTkQQ-1641780660121)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211220224908900.png)]
listen 函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6fv6dO5-1641780660122)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211220225325892.png)]
connect 函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hYeflag9-1641780660123)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211220225520158.png)]
accept函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hA5sI2qH-1641780660124)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211220225836817.png)]
函数小结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Z6i8AyG-1641780660125)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211220230348972.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKUJTrO8-1641780660126)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211220230411996.png)]
关于网络字节顺序
TCP/IP 定义了 网络字节顺序
某些Socket API 函数的参数需要存储为网络字节顺序
注意 本地字节顺序与网络字节顺序间的转换 转换函数如下:
htons 、ntohs 、 htonl 、 ntohl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1hDuojXg-1641780660127)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211225163613897.png)]
Socket编程—客户端软件设计
解析服务器IP地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLZLsJNg-1641780660127)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211225164607630.png)]
解析服务器端口号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-scKmSID4-1641780660128)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211225164825964.png)]
解析协议号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ELCrY4kY-1641780660128)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20211225164926586.png)]
TCP客户端软件流程
1、确定服务器IP地址与端口号
2、创建套接字
3、分配本地端点地址(IP地址+端口号)
4、连接服务器(套接字)
5、遵循应用层协议进行通信
6、关闭/释放连接
UDP客户端软件流程
1、确定服务器IP地址与端口号
2、创建套接字
3、分配本地端点地址(IP地址+端口号)
4、指定服务器端点地址,构造UDP数据报 (以数据报为单位)
5、遵循应用层协议进行通信
6、关闭/释放套接字
客户端软件的实现-connectsock()
循环无连接服务器
============================================================
传输层
传输层服务概述:
传输层协议为运行在不同端系统上的应用进程之间提供了一种**逻辑通信机制。**而网络层是提供主机之间的逻辑通信机制,位于网络层之上、依赖于网络层服务,又对网络层服务进行增强。
逻辑通信机制:端到端通信机制,两个进程之间仿佛是直接连接的。不用关心物理距离、有多少个路由器、媒介等
作为发送方:传输层将应用递交的消息分成一个或多个的Segment,并向下传给网络层。
作为接受方:传输层将接收到的segment组装成消息,并向上交给应用层。
提供了可靠的、按序的交付服务(TCP),如拥塞控制、流量控制、连接建立
也提供了不可靠的交付服务(UDP)。
但是以上两个服务均没有提供延时方面的保障。
多路复用和多路分用
多路分用:
主机接收到IP数据报,每个数据报携带源IP地址、目的IP地址,每个数据报携带一个传输层的段,每个段携带源端口号和目的端口号。
主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket
无连接多路分用:
1、利用端口号创建Socket
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YjdSeDQZ-1641780660129)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109174954862.png)]
2、UDP的Socket用二元组标识 (目的IP地址,目的端口号)
3、主机收到UDP段后
检查段中的目的端口号
将UDP段导向绑定在该端口号的Socket
4、来自不同源IP地址和源端口号的IP数据包被导向同一个Socket
面向连接的多路分用:
1、TCP的Socket用四元组标识(源IP地址,源端口号,目的IP地址,目的端口号 )
可靠数据传输机制
可靠: 不出错、不丢包、不乱序
基本结构:接口!
rdt_send() 被上层应用所调用(单向)
udt_send() 与网络层之间调用 双向
rdt_rcv() 双向
deliver_data() 被rdt调用,向上层应用交付数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQtpxGlN-1641780660130)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109194622887.png)]
rdt 1.0基于可靠信道
rdt 2.0 不可靠信道 :产生位错误的信道
底层信道可能翻转分组中的位
利用校验和检测位错误
那么,如何从错误中恢复?
确认机制(ACK):接收方显式地告诉发送方分组已正确接收
NAK:接收方显式地告诉发送方分组有错误
发送方收到NAK后,重传分组
以上可以称之为 停 - 等 协议
Rdt 2.0 有什么缺陷呢?
如果!ACK/NAK消息发生错误/被破坏怎么办呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFUptRX1-1641780660130)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109211519349.png)]
Rdt 2.1 增加了 序列号 机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LDFfIbIE-1641780660131)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109211921757.png)]
Rdt 2.2 :无NAK消息协议
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4HKGFuP-1641780660132)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109212150896.png)]
Rdt 3.0
Rdt 1.0 —Rdt 2.2 均是在信道不会发生丢失分组的情况下 考虑的。
Rdt 3.0 需要考虑 信道既可能发生错误,也可能丢失分组。
那么原来的 “校验和 + 序列号 + ACK + 重传 ” 的方式就不够用了。
发送方发送一个数据,接收方会等待,如果数据丢失,接收方就会一直等下去,这个传输过程就 “死掉了”。
于是我们可以让 发送方等待 “合理”的时间(加入定时器),如果长时间没有收到ACK,那么就重传。但是哦,如果发生延迟,实际并没有丢失,这就导致重传产生数据重复,于是序列化机制就能够处理了。
性能很差! 它限制了物理资源的利用。导致性能差的原因就是 停 – 等操作
流水线机制与滑动窗口协议
如何改善上述性能很差的原因呢?
上述 停 – 等 操作是基于平等 原理,发一个,接收一个。
那么是不是打破这种平等,就能提高性能呢?如,发送一个,在等待的同时,发送第二个,这样就提高性能了。
利用流水线机制,一次性多发一些,可以提高网络资源利用率。
流水线协议:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K26XM56a-1641780660132)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109214825777.png)]
若实现流水线机制,那么需要滑动窗口协议帮忙实现。
滑动窗口协议:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUYBgFej-1641780660133)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109215303897.png)]
GBN协议:
流量控制机制
拥塞控制机制
UDP协议:无连接传输服务
UDP协议基于Internet IP协议,增加了复用/分用功能和简单的错误校验。
因为IP协议是不可靠的、尽力而为的服务,故UDP协议也是提供了 “Best effort - 尽力而为” 的服务,因此UDP段可能存在丢失、和非按序到达的情况。
无连接,因此UDP发送方和接收方之间不需要握手,所以每个UDP段的处理独立于其他段。
那么?UDP为什么还存在?
1、由于无需建立连接,所以延迟很短。如DNS用的就是UDP
2、实现简单,无需维护连接状态
3、头部开销少
4、没有拥塞控制:应用可以更好的控制发送时间和速率。
由此常用于 流媒体应用,容忍数据丢失,且对速率敏感。
如何在UDP上实现可靠的数据传输呢?
1、在应用层增加可靠性机制(但是开发难度很大)
2、应用特定的错误恢复机制
简单的错误校验:
报文段上的:checksum 目的就是检测UDP段在传输中是否发生错误(如位翻转等)。
校验方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMysFfeT-1641780660133)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109183719324.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGouT6qB-1641780660134)(C:\Users\背包十年\AppData\Roaming\Typora\typora-user-images\image-20220109183737022.png)]
TCP协议:面向连接的传输服务
TCP拥塞控制
议:无连接传输服务
UDP协议基于Internet IP协议,增加了复用/分用功能和简单的错误校验。
因为IP协议是不可靠的、尽力而为的服务,故UDP协议也是提供了 “Best effort - 尽力而为” 的服务,因此UDP段可能存在丢失、和非按序到达的情况。
无连接,因此UDP发送方和接收方之间不需要握手,所以每个UDP段的处理独立于其他段。
那么?UDP为什么还存在?
1、由于无需建立连接,所以延迟很短。如DNS用的就是UDP
2、实现简单,无需维护连接状态
3、头部开销少
4、没有拥塞控制:应用可以更好的控制发送时间和速率。
由此常用于 流媒体应用,容忍数据丢失,且对速率敏感。
如何在UDP上实现可靠的数据传输呢?
1、在应用层增加可靠性机制(但是开发难度很大)
2、应用特定的错误恢复机制
简单的错误校验:
报文段上的:checksum 目的就是检测UDP段在传输中是否发生错误(如位翻转等)。
校验方法:
[外链图片转存中…(img-WMysFfeT-1641780660133)]
[外链图片转存中…(img-SGouT6qB-1641780660134)]
TCP协议:面向连接的传输服务
TCP拥塞控制
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)