计算机网络

一、五层协议

一般折中OSI和TCP/IP,采用五层协议。(自上而下)

5 应用层:

参考

应用层的任务是通过使用进程间的交互来完成特定网络应用。应用层定义的是应用进程(进程:主机中正在运行的程序)间的交互规则,对于不同的网络应用需要不同的应用协议。应用层协议很多,如DNS,HTTP协议,电子邮件SMTP协议,把应用层交互的数据称为报文

  • DNS

    域名系统,是因特网的一项核心服务,是一个将域名和IP地址映射的一个分布式数据库。

  • HTTP协议

    超文本传输协议。所有的www文件都遵守这个标准。设计Http最初的目的是为了提供一种发布和接收HTML页面的方法。

  • websocket

4 运输层:

参考

负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用报文。由于一台主机可以同时运行多个线程,因此传输层具有复用和分用的功能。复用就是指多个应用进程可以同时用下面传输层的服务,分用则是把运输层把收到的消息交付到上面应用层中的相应进程。

运输层主要负责以下两种协议:

  • 传输控制协议TCP:提供面向连接的,可靠的数据传输服务。
  • 用户数据协议UDP:无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

3 网络层:

参考

在计算机网络中进行通信的两个计算机可能会讲过很多个数据链路,也可能还要经过很多通信子网。网络层的作用就是选择合适的网间路由和交换节点,确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报

运输层的数据报UDP和网络层的IP数据报不一样,另外,无论是哪一层的数据单元,都可以笼统的用“分组”来表示。

互联网是大型的异构网络通过路由器连接起来的。互联网使用的网络层协议是无连接的网际协议和许多路由选择协议,因此互联网的网络层也叫作网际层IP层

2 数据链路层:

简称为链路层。两台主机传输数据,是在一段一段的数据链路上传送的,需要专门的链路层协议。在两个相邻的节点传输数据时,链路层将网络层交下来的IP数据报组装成帧,在两个相邻的节点传送帧。每一帧包括数据和必要的信息(同步信息,地址信息,差错控制等)。

在接收数据时,控制信息使得接收端能够知道一个帧从哪个比特开始到哪个比特结束。这样链路层在收到一个帧后就可以从中提取数据部分。控制信息还使得接收端能够检测到所收到的帧中有错误差。发现差错,链路层简单的丢弃这个帧,避免浪费资源。如果需要改正差错,就要采用可靠性传输协议来纠正差错。

1 物理层:

在物理层上传送的数据是比特。物理层的作用是实现相邻计算机节点之间比特流的透明传输,尽可能屏蔽掉具体传输介质和物理设备的差异。使得其上面的链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化。

计算机网络复习

二、TCP

TCP报文结构

tcp_head

  • 32位序列号:
    • 含有同步标识SYN,则为最初的序列号;第一个数据比特的序列码为本序列号加一
    • 如果没有同步标识(SYN),则此为第一个数据比特的序列码
  • 32位确认号:希望收到的下一个数据报的序列号,表明到序列号 N-1 为止的所有数据已经正确收到。
  • TCP协议数据报头长:4位长。表明TCP头中包含多少个 4字节
  • 保留:置0
  • ACK:期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1
  • PSH:表示是带有PUSH标志的数据。接收方因此请求数据报一到便可送往应用程序而不必等到缓冲区装满时才传送。
  • RST:用于复位由于主机崩溃或其它原因而出现的错误的连接。还可以用于拒绝非法的数据报或拒绝连接请求。
  • SYN:用于建立连接。
  • FIN:用于释放连接。
  • 窗口大小(WIN):16位长。表示从确认号开始,本报文的发送方(数据发送端 or 数据接收端)可以接收的字节数,即接收窗口大小。用于流量控制。
  • 校验和(Checksum):16位长。是为了确保高可靠性而设置的。它校验头部、数据和伪TCP头部之和。
  • 紧急指针:URG=1时才有意义。

TCP最小长度是20字节。

TCP三次握手和四次挥手

为了准确的把数据传送到目标,TCP协议采用了三次握手策略。

  • 客户端:发送带有SYN标志的数据报——一次握手(服务端)
  • 服务端:发送带有SYN/ACK标志的数据报——二次握手(客户端)
  • 客户端:发送带有ACK标志的数据包——三次握手(服务端)

为什么三次握手?

计算机网络复习-第 2 页

  • 建立可靠的通信信道,通讯简单来说就是数据的发送和接收,三次握手的主要目的是双方确认自己与对方的发送与接受是正常的。
  • 第一次握手:客户端什么都不能确认,服务端确认对方发送正常,自己接收正常。
  • 第二次握手:客户端确认:自己发送接收正常,对方发送接收正常。服务端确定:对方发送正常,自己接收正常。
  • 第三次握手:客户端确认:自己发送接收,对方发送接收正常。服务端确认:自己发送接收、对方发送接收正常。

为什么传回SYN?

传回SYN的目的是为了告诉发送端,我接收到的信息确实就是你发送的信号。

SYN 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ])消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

传SYN,为啥还要传ACK?

两者互相通信无误才行。传了SYN,证明发送方到接收方的通道没问题,接收方到发送方的通道还需要ACK信号来验证。

断开一个TCP连接需要四次挥手:

计算机网络复习-第 3 页

  • 客户端:发送一个FIN,用来关闭客户端到服务器的数据传输。
  • 服务端:收到FIN,它发回一个ACK,确认信号为收到的需要+1,。和SYN一样,一个FIN将占用一个序号。
  • 服务端:关闭与客户端的连接,发送一个FIN给客户端
  • 客户端:发回ACK报文确认,并将确认序号设置为收到序号+1.

为什么需要四次挥手?

任何一方都可以发送连接释放的通知,对方确认后进入办关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。更具体一点:AB两人通话,A:我说完了。B:我知道了(但我可能还有话说)。B:我也说完了。A:知道了(挂断)。

TCP,UDP协议的区别

UDP在传送数据之前不需要建立连接,远程主机收到UDP报文后,不需要给出任何确认。虽然UDP不提供可交付,但是比较有效。比如:QQ语音,视屏,直播。

TCP提供面向连接的服务。传送前建立连接,传送后断开连接。不提供广播或者多播服务。(可靠性体现在三次握手,在数据传输时,还有确认,窗口,重传等等,在数据传输之后,还会断开连接来释放资源)。增加很多开销,使得协议数据单元的首部增大很多。一般用于文件传输,发送和接受邮件,远程登陆。

TCP如何保证可靠传输?

分块,编号,校验和,流量控制,拥塞机制,ARQ,超时重传。

  • 数据被分割成TCP认为最适合传输的数据块
  • 给发送的每一个包进行编号,接收方对数据报进行排序,把有序数据传给应用层。
  • 校验和:TCP将保持他首部和数据的校验和。这是一个端到端的检验和,目的是检验数据在传输的过程中的任何变化,有变化则丢弃并不确认收到此报文。
  • TCP接收端会丢弃重复的数据。
  • 流量控制:连接双方有缓冲空间,只允许发送缓冲区能接纳的数据,接收端来不及处理的时候提示发送方降低发送速率,防止丢包。缓冲区是可改变大小的滑动窗口协议。
  • 拥塞控制:网络阻塞时,减少数据的发送
  • ARQ协议:每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  • 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

滑动窗口和流量控制

TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

拥塞控制

为了进行控制,TCP维持一个拥塞窗口的状态变量。窗口的大小取决于网络的拥塞程度,动态变化,发送方让自己的发送窗口取为拥塞窗口和接收方的接收窗口中较小的一个。

采用了四种算法:慢开始、拥塞避免、快重传、快恢复。

  • 慢开始:因为不知道情况,小到大增加发送窗口,cwnd(拥塞窗口)初始1,每次加倍。
  • 拥塞避免:让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT(网络时延)就把发送放的cwnd加1.
  • 快重传与恢复:FRR(快速重传与恢复)能快速恢复丢失的数据包,没有FRR,丢失后,TCP使用定时器要求传输暂停。有了FRR,接收方收到一个不按照顺序的数据段,立即发送于一个重复确认。如果发送方接到三个重复确认,会假定指出的数据丢失,立即重传丢失的数据。有了 FRR,就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

ARQ协议

自动重传请求是OSI模型汇总数据链路层和传输层的错误纠正协议之一。使用确认和超时连个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送一段时间没有收到确认帧,通常重新发送。ARQ通常包括:停止等待ARQ和连续ARQ协议。

停止等待ARQ:

  • 为了实现可靠传输,原理是:发送完停止,等待对方确认(回复ACK),超时没有收到ACK,则重新发送。
  • 若接收方收到重复分组,丢弃,但需要发送确认。

优点:简单

缺点:信道利用率低,等待时间长。

  1. 无差错情况:

    收到ACK,再次发送。

  2. 出现差错(超时重传)、

    发送完一个分组需要一个超时计时器。这种重传方式通常称为:自动重传请求ARQ。

  3. 确认丢失和确认迟到

    • 确认丢失:确认消息丢失,客户端再次发送,服务端收到消息采取以下搓手:丢弃消息,不向上层交付。再次发送确认消息。
    • 确认迟到:A发,B确认,但消息迟到。A再发,B第二次确认到达。传输别的。A收到第一次确认到达。处理方式:A收到重复确认直接丢弃,B收到重复的数据直接丢弃。

连续ARQ

可以提高信道利用率。发送方位置控制一个发送窗口,窗口内的分组连续发送,无需ACK,接收方累计确认,对顺序到达的最后一个分组发送ACK,表明到这个分组为止的所有分组都正确收到。

有点:信道利用率高,容易实现,即使确认丢失,也不不必重传。

缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。

三、HTTP

HTTP报文结构

请求报文头部

  • User-Agent:产生请求的浏览器类型。
  • Accept:客户端可识别的响应内容类型列表;
  • Accept-Language:客户端可接受的自然语言;
  • Accept-Encoding:客户端可接受的编码压缩格式;
  • Accept-Charset:可接受的应答的字符集;
  • Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;(必选)
  • Connection:连接方式(close 或 keep-alive);
  • Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;
  • 请求包体:在POST方法中使用。
  • Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
  • If-Modified-Since:文档的最后改动时间

响应头部

  • Allow 服务器支持哪些请求方法(如GET、POST等)。
  • Content-Encoding 文档的编码(Encode)方法。
  • Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
  • Content-Type 表示后面的文档属于什么MIME类型。
  • Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
  • Expires 应该在什么时候认为文档已经过期,从而不再缓存它。
  • Last-Modified 文档的最后改动时间。
  • Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。
  • Server 服务器名字。
  • Set-Cookie 设置和页面关联的Cookie。
  • ETag:被请求变量的实体值。ETag是一个可以与Web资源关联的记号(MD5值)。
  • Cache-Control:这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。

Q:输入URL地址,显示主页的过程

更详细的参考这里

主要会使用到哪些协议。

过程:

  • 1、浏览器查找域名的IP地址(浏览器缓存,路由器缓存,DNS缓存)
  • 2、浏览器向WEB服务器发送http请求(cookies会随着请求发送给服务器)
  • 3、服务器处理请求
  • 4、服务器发回一个HTML响应。
  • 5、浏览器开始显示HTML

协议:

  • DNS
  • TCP:与服务器建立TCP连接
  • IP:建立TCP协议,需要发送数据,发送数据再网络层使用IP协议
  • OPSF:IP数据包在路由器期间,路由选择使用此协议。
  • ARP:路由器与服务器通信,将IP转化为mac地址
  • HTTP:TCP建立后,通过HTTP访问网页。

Q-状态码

类别 原因短语
1.. 信息性状态码 接收的请求正在处理
2.. 成功状态码 请求正常处理完毕
3.. 重定向状态码 需要进行附加操作完成请求
4.. 客户端错误状态码 服务器无法处理请求
5.. 服务器错误状态码 服务器处理请求出错
  • 3

    重定向,需要进一步的操作以完成请求

    • 301 Moved Permanently。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
  • 302 Moved Temporarily。与301类似。但资源只是临时被移动。客户端应继续使用原有URI

    • 304 Not Modified。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
  • 4

    客户端错误,请求包含语法错误或无法完成请求

    • 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用

    • 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
    • 404 Not Found 请求的资源不存在,例如,输入了错误的URL
  • 5

    服务器错误,服务器在处理请求的过程中发生了错误

    • 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
  • 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

Q-各种协议与HTTP协议的关系

image-20210320222328026

Q-HTTP长连接、短连接

HTTP/1.0默认短连接,客户端每次访问某个html或者其他类型的web中包含其他的web资源(JS文件,图像,CSS),每次遇到这样一个web资源,浏览器就会重新建立一个HTTP会话。

从HTTP/1.1默认使用长连接,会在响应头加入

1
connection:keep-alive

长连接,每次一个网页打开,客户端和服务器之间用于传输HTTP数据的TCP连接不关闭。不会持久保持,有保持时间,可以在不同的服务器软件设定。实现长连接的客户端和服务器都需要支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接短连接。

Q-HTTP如何保存用户状态

HTTP是无状态协议,自身不对请求体和响应体之间的通信状态进行保存。Session机制,通过服务端记录用户状态。典型的场景是购物车,当你添加商品到购物车时,系统不知道是哪个用户,服务器给特定的用户创建特定的Session来标识这个用户并跟踪。(过期销毁)。

在服务端保存session方法:内存和数据库(redis),既然session在服务端,那如何实现session跟踪呢?通过在cookie中添加一个session ID 的方式来实现追踪。

cookie被禁用了怎么办?

URL重写,直接把Session ID附加在URL路径的后面。

Cookie和Session都用来跟踪浏览器用户身份的会话方式,但是场景不太一样。

Cookie一般保存用户信息:

  • 在cookie中保存已经登录过的用户信息,下次访问网站可以自动填写基本信息。
  • 保持登录,在cookie中存放了token。
  • 登录一次网站后访问网站其他页面不需要登陆。

Cookie数据保存在客户端,Session保存在服务器端。

Session安全性更高。

Q-HTTP/1.0和HTTP/1.1

  • 1.0默认长连接。1.1的持续连接有流水线和非流水线方式。流水线是客户端收到HTTP的响应报文之前能接着发送新的请求报文。非流水线是客户端在收到前一个响应后才能发送下一个请求。
  • 错误状态响应码:新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
  • 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  • 带宽优化以及网络连接的使用:1.0存在浪费带宽,例如客户端要对象的一部分,但是服务端把整个对象都穿过来,不支持断点续传。1.1在请求头引入range头域,允许只请求资源的某个部分,返回206。

Q-URL和URI

URI:统一资源标志符,唯一表示一个资源

URL:统一资源定位符,可以提供资源的路径。是具体的URI。

URI像身份证,URL像家庭住址。不仅标识资源,还提供定位资源的信息。

Q-HTTP和HTTPS

HTTPS补充

  • 端口:HTTP默认80,HTTPS默认443
  • 安全性和资源消耗:HTTP基于TCP,传输明文,客户端和服务器都无法验证对方身份。HTTPS运行在SSL/TLS上面的HTTP协议,运行在TCP之上,对称加密,安全性高但是消耗更多服务器资源。
    • 对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等;
    • 非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。

五、websocket

一种与HTTP不同的协议。两者都位于OSI模型的应用层,依赖TCP协议。虽然不同,但是RFC规定:WebSocket设计为通过80和443端口工作,支持HTTP代理和中介,从而和HTTP兼容,为了实现兼容,W握手使用HTTP ,Upgrade头从HTTP协议更改为W协议。

与H不同,W提供权全双工通信。此外,W还可以在TCP之上启用消息流。TCP单独处理字节流,没有固定的消息概念。

WebSocket协议规范将 ws(WebSocket)和 wss (WebSocket Secure)定义为两个新的统一资源标识符(URI)方案,分别对应明文和加密连接。

优点:

  • 较小的控制开销:
  • 更强的实时性:由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;
  • 保持连接状态:与 HTTP 不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
  • 更好的二进制支持:Websocket 定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
  • 可以支持拓展:Websocket 定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
  • 更好的压缩效果:相对于HTTP压缩,Websocket 在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率

连接过程:

W是独立的、创建在TCP上的协议,W通过HTTP/1.1协议的101状态码进行握手。为了创建W连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为握手。

  • 客户端请求

    1
    2
    3
    4
    5
    6
    7
    GET / HTTP/1.1
    Upgrade: websocket
    Connection: Upgrade
    Host: example.com
    Origin: http://example.com
    Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
    Sec-WebSocket-Version: 13
  • 服务器回应

    1
    2
    3
    4
    5
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
    Sec-WebSocket-Location: ws://example.com/

六、补充

参考资料

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信