WJ的计算机网络知识点总结


【计算机网络篇】


OSI七层网络模型

  • 应用层|报文】:
    访问网络服务的接口,对用户提供应用程序。
    HTTP、FTP、SMTP、DNS、Telnet
  • 【表示层】
  • 【会话层】
  • 传输层|数据段或报文段】:
    提供应用进程之间的逻辑通信,对报文进行分组和重组,以TCP或UDP协议格式封装报文。
    TCP、UDP
  • 网络层|数据包或分组】:
    为数据在结点之间传输创建逻辑链路,并分组转发数据。负责路由以及把分组报文发送给目标网络或主机。
    IP、ICMP、IGMP、ARP、RARP
  • 数据链路层|】:
    在通信实体间建立数据链路连接,封装和解封装IP报文,发送和接受ARP/RARP报文。
    SDLC、HDLC、PPP、STP
  • 物理层|比特】:
    为数据端设备提供原始比特流的传输的通路。

五层网络模型没有表示层和会话层

TCP/IP协议簇简化为四层:
应用层、传输层、网络层、通信链路层


HTTP和HTTPS


什么是HTTP

HTTP是一种超文本传输协议,超文本就不单单只是文本,还可以传输图片、音频、超链接等等。

HTTP报文结构

请求报文

  • 请求行:请求方法、URL、协议版本
  • 请求头
  • 请求包体(Body)

响应报文

  • 状态行:协议版本、状态码、状态码描述
  • 响应头
  • 响应包体(Body)

HTTP常见请求头

通用标头

  • Date: 格林威治时间,创建报文的日期时间
  • Cache-Control: 和缓存验证相关,请求响应不一样
  • Connection: keep-alive(持久性连接),close(非持久性连接)
  • Pragma:报文指令

实体标头:用于描述正文消息

  • Content-Length: 实体主体的大小(字节)
  • Content-Language: 能够接受的语言
  • Content-Encoding: 适用的编码方式,用来压缩媒体类型(gzip,compress,deflate,identity)
  • Last-Modified: 最后修改的时间
  • Allow: 资源可支持的HTTP方法

请求标头

  • Host: 指明了服务器的域名、端口(默认80)
  • Referer: 告诉服务器该网页是从哪个页面链接过来的
  • If-Modified-Since:
  • If-Modified-Match
  • Accept: 接受请求HTTP标头会通告客户端其能够理解的MIME类型(用来表示文档、文件或字节流的性质和格式)
  • Accpet-Charset: 规定服务器处理表单数据所接受的字符集(UTF-8\Unicode\ISO-8859-1)
  • Accept-Language: 优先的语言

响应标头

  • Access-Control-Allow-Origin:指定一个来源,告诉浏览器允许该来源进行资源访问
  • Keep-Alive: 表示的是Connnection非持续连接的存活时间,可以指定
  • Server: HTTP服务器的安装信息(比如是什么系统)

HTTP状态码


100 + 消息
200 + 成功
300 + 重定向
400 + 错误
500 + 服务器错误


HTTP的版本


HTTP 1.0

  • 仅提供最基本的认证,用户名密码没有加密
  • 使用短链接,每次发数据都要三次握手四次挥手,效率低
  • 只使用header中的If-Modified-Since和Expires作为缓存失效的标准
  • 不支持端点续传,每次都会传送全部的页面和数据。
  • 认为每台计算机只能绑定一个IP,请求消息中的URL没有传递主机名

HTTP 1.1

  • 使用摘要算法进行身份验证
  • 默认使用长连接。长连接就是只需一次建立就可以传输多次数据,传输完成后,只需要一次切断连接即可。长连接的连接时长可以通过请求头中的keep-alive来设置
  • 增加了E-tag、If-Unmodified-Since、If-Match、If-None-Match等缓存控制头来控制缓存失效
  • 支持端点续传,使用请求头中的Range来实现
  • 使用了虚拟网络,在一台物理机上可以存在多个虚拟主机,并且它们可以共享一个IP地址

HTTP 2.0

  • 头部压缩,1.1版本可能会出现User-Agent、Cookie、Accept、Server、Range等字段占用较多字节,使用HPACK算法进行压缩
  • 二进制格式,使用了更加靠近TCP/IP的二进制格式,抛弃了ASCLL码,提升了解析效率
  • 强化安全,HTTP2.0一般都跑在HTTPS上
  • 多路复用,即每一个请求都是用作连接共享,一个请求对应一个id,一个连接上可以有多个请求

HTTP使用TCP还是UDP

http1.0 2.0都是基于TCP
http 3.0基于 UDP,利用介于传输层和应用层之间的一个协议QUIC协议保证可靠传输


Cookie和Session

HTTP是一种无状态协议,服务器没有办法单从网络连接知道访问者的身份,为了解决这个问题,就产生了Cookie和Session。

【浏览器允许Cookie的话】

服务端发送请求时,服务端会发送一个认证信息。
服务器第一次收到请求视开辟了一块Session空间(创建了Session对象),同时生成一个SessionID,通过响应头的Set-Cookie: JSESSIONID=XXXXX命令向客户端发送要求设置Cookie的响应。

客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXCookie信息,该Cookie的过期时间为浏览器会话结束。

接下来客户端每次向同一个网站发送请求时都会带上该Cookie信息(包含SessionID),然后服务器通过读取请求头中的Cookie信息,获取到SessionID,服务端就可以检索是否存在这个ID


Cookie

Cookie实际上是一小段的文本信息。
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。
客户端浏览器会把Cookie保存起来,当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。

Cookie可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须回传这些Cookie,如果Cookie很多,无形增加了客户端与服务端的数据传输量。

Session的出现就是为了解决这个问题,同一个客户端每次和服务端交互时,不需要每次都传回所有的Cookie值,而是只有传回一个ID,每个客户端是唯一的。


Session

Session机制是一种服务端的机制,服务器使用一种类似散列表的结构来保存信息。

当程序需要为了某个客户端的请求创建一个session时,服务器首先检查这个客户端里的请求是否已包含了一个session标识 session ID

如果已经包含了一个ID,此前已经为此客户端创建过Session,服务器就把这个Session检索出来使用。

如果客户端请求不包含ID,为此客户端创建一个Session。

SessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串(服务器会自动创建),这个Session ID将被在本次响应中返回给客户端保存。


JWT

让浏览器具有记忆功能的另一种机制是JWT。和Cookie不同,JWT是保存在客户端的信息,广泛应用于单点登录的情况。

  • JWT的Cookie信息存储在客户端,而不是服务端缓存。JWT直接进行本地验证就可以,验证完毕后Token就会在Session中随请求一起发到服务器。这种方式,可以节省服务器资源,并且token可以进行多次验证。
  • JWT支持跨域认证,Cookie只能用在单个节点的域或者子域中有效。如果它们尝试通过第三个节点访问,就会被禁用。使用JWT可以解决这个问题,使用JWT能够通过多个节点进行用户认证,也就是跨域认证。

Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮


GET和POST

  • GET把参数包含在URL中,POST通过request body传递参数
  • GET比POST更不安全,因为参数直接暴露在URL上;POST方法是把参数放在请求体body中,对用户不可见
  • GET请求的URL有长度限制,而POST请求不会(除非自己设置)
  • GET请求在浏览器反复的回退前进是无害的,但是POST请求会再次提交表单请求
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置
  • GET产生一个TCP数据包;POST产生两个TCP数据包。
    GET浏览器会把http header和data一并发送出去,服务器响应200返回数据;POST浏览器会先发送header,服务器响应100 continue,浏览器再发送数据,服务器响应200返回数据
  • GET请求只能进行URL编码,POST支持多种编码方式
  • GET请求参数会被完整保留在浏览器历史记录里,POST的参数不会被保留
  • GET产生的URL地址可以被Bookmark, POST不可以

HTTPS

HTTPS是HTTP+TLS/SSL协议组合而成,所以不是纯粹的应用层协议

SSL协议可分为两个,分别对应网络层和传输层:
SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等

加密:http协议对传输的数据不进行加密,https协议对传输的数据SSL安全协议加密,https加密需要CA签发的证书。

端口:http协议使用TCP的80端口;https协议使用TCP的443端口

网络分层模型:http可以明确是位于应用层,https是在http的基础上加了SSL安全协议,而SSL是传输层协议,所以https是应用层和传输层的结合

使用HTTPS访问网站时,就会进行TLS握手。
TLS具体的握手过程会根据使用的密钥交换算法的类型和双方支持的密码套件而不同。

  • 通信之前先三次握手、再TLS握手
  • 客户端发送hello消息来发起握手,夹带客户端支持的TSL版本、密码套件、客户端随机数。
  • 然后服务端发送一条消息,包含服务端的SSL证书(SSL证书是CA证书的一种)、服务端选择的密码套件、服务端生成的随机数
  • 客户端的证书颁发机构会认证SSL证书,然后发送Certificate报文,报文中包含公开密钥证书。

……
具体见下面讲解


HTTPS通过SSL/TSL保障安全性

密钥

  • 服务端生成一对公钥和私钥,将公钥和证书发送给客户端
  • 客户端验证证书通过后生成一个对称加密的密钥,并使用服务器生成的公钥加密,发送给服务器
  • 服务器使用私钥解密获得对称加密密钥
  • 客户端和服务器互相发送消息认可对称加密密钥,至此加密通道建立
  • 开始数据传输,在检验数据完整性的基础上,使用对称加密密钥进行加密解密

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的。
使用了 RSA 密钥协商算法,TLS 完成四次握手后,才能进行应用数据传输,而对于 ECDHE 算法,客户端可以不用等服务端的最后一次 TLS 握手,就可以提前发出加密的 HTTP 数据,节省了一个消息的往返时间;

证书验证
一般来说浏览器都内置了CA的根证书客户端使用根证书的密钥对服务器发来的证书进行解密验证,若域名、有效期、签发机关等验证项符合则通过,否则认定证书无效,断开连接。

TSL是在SSL基础上增强,现在都是用TSL。


为什么要CA认证?

用户A公开了自己的公钥,有一个不怀好意的用户B也公开发自己的公钥,但它却是B的身份?其他人如何确定哪个公钥是正确的?也就是说我们无法确定谁才是真正的公钥。

这就用到一个能给你证明谁才是真正用户的机构CA。严格来说它是一个证书服务器,这个证书服务器会向你保证谁是真的用户。

有这么一个证书它保证了所有用户的公钥,用户B说明自己是A时,我们通过证书机构拿出A的公钥来验证B的信息肯定是不对的。

谁又能证明这个证书机构不是假冒的呢?答案非常简单,是另一个更有权威的证书机构。那么谁又能证明你这个更有权威的机构是真实的呢?当然是还有一个权威机构…最后的那个叫根机构。根机构不需要证明,它把自己的证书直接安装在你的系统中。因此你的计算机中的证书根机构被更改你就完了。否则这所有的验证都可以最终验证到根机构上来,而根机构的证书可以验证你的根机构是否正确。而这个验证的链条叫做证书链。

参考来源:RSA怎么使用


HTTP和HTTPS的区别

  • HTTP在地址栏上的协议是以http://开头的,而HTTPS是以https://开头
  • HTTP是没有安全加密的协议;HTTPS是安全的协议,通过密钥交换算法-签名算法-对称加密算法-摘要算法解决安全问题
  • HTTP的默认端口是80,HTTPS是443

FTP和SFTP

FTP是TCP/IP协议组中的协议之一,
FTP服务器用来存储文件
FTP客户端用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源
端口号 20 21

SFTP是SSH File Transfer Protocol的缩写,安全文件传输协议,SFTP与FTP有着几乎一样的语法和功能,SFTP为SSH的其中一部分,是一种传输档案至Blogger伺服机的安全方式,其实在SSH软件包中,已经包含了一个叫做SFTP的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(默认端口号为22)来完成相应的连接和答复。

FTP和SFTP的区别:
链接方式:FTP使用TCP端口21上的控制连接建立连接,SFTP是在客户端和服务器之间通过SSH协议(TCP端口号22)建立的安全连接来传输文件。
安全性:SFTP使用加密传输认证信息和传输的数据,所以使用SFTP相对于FTP是非常安全
效率:SFTP这种传输方式使用了加密解密技术,所以传输效率比普通的FTP要低得多。


DNS


Domain Name System 域名系统。

互联网中识别主机是通过主机名和IP地址,人们喜欢主机名这种好记忆的方式,但是通信链路喜欢有层次的IP地址。
所以就需要有将主机名转换为IP地址的服务,由DNS提供。

DNS是一种有分层DNS服务器实现的分布式数据库,DNS运行在UDP上,端口53。使用的是UDP,性能更好,查询时间更短,如果数据丢失,重传一个就好了。

DNS解析有两种方式,分为递归查询迭代查询
一般的主机向本地域名服务器的查询使用递归查询,本地域名服务器向根域名服务器查询使用迭代查询。
如果根域名服务器无法告知本地DNS服务器下一步去问哪个顶级域名服务器,就会使用递归查询;如果可以就使用迭代查询。


TCP

TCP全称是Transmission Control Protocol,传输控制协议。

建立TCP连接需要Socket、序列号、窗口大小这些状态信息。

  • Socket: 由IP地址和端口号组成
  • 序列号:解决乱序问题
  • 窗口大小:做流量控制

TCP的四元组可以确定一个连接:
源地址、源端口、目标地址、目标端口。


有一个IP的服务器监听了一个端口,它最大的连接数是多少?
最大TCP连接数=客户端IP数*客户端端口数
对于Ipv4,客户端的IP数量最多为2的32次方,客户端的端口数最多为2的16次方,也就是服务器单机最大连接数约为2的48次方。

但是实际服务端最大并发TCP连接数量达不到理论上线。


TCP和UDP的区别

  • TCP是面向连接的协议,UDP是无连接的协议
  • TCP有拥塞控制,UDP没有
  • TCP面向字节流,UDP面向报文
  • TCP只能点对点,UDP可以一对一,一对多,多对多
  • TCP会按照特定顺序重新排列数据包;UDP数据包没有固定顺序,数据包都相互独立
  • TCP传输速度比较慢,UDP传输速度要更快
  • TCP是可靠传输;UDP不是,无法保证将数据传送到目标
  • TCP会使用握手协议,SYN、SYN-ACK、ACK;UDP不用

TCP头部格式

TCP头部至少20个字节

源端口号(16bit)、目的端口号(16)
序列号(32)
确认应答号(32)
首部长度(4)、保留(6)、六个控制位、窗口大小(16)
校验和(16)、紧急指针(16)
选项(长度可变)
数据

序列号:在建立连接时由计算机生成的随机数作为初始值,通过SYN包传给接收端。每发送一次数据,就累加一次该数据字节数大小。用于解决网络包乱序问题

确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答后可以认为在这个序列号之前的数据都被正常接收。

控制位

  • ACK:为1时,确认应答字段有效,TCP规定除了初始SYN包之外该位必须为1
  • RST:为1时,TCP连接中出现异常必须强制断开连接
  • SYN:为1时,表示希望建立连接,并在其序列号的字段进行序列号初始值的设定
  • FIN:为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。

TCP三次握手

SYN: 这个消息用来初始化和建立连接的
ACK:帮助对方确认收到的SYN消息
SYN-ACK:本地的SYN消息和较早的ACK数据包
FIN:用来断开连接

  • SYN :同步序列编号,握手信号,接受到SYN时会在自己的段内生成一个随机值X
  • SYN-ACK:服务器收到SYN后,打开客户端连接,发送一个SYN-ACK作为答复。确认号设置为比接受到的序列号多一个,即X+1,服务器为数据包选择的序列号seq是另一个随机数Y
  • ACK:确认字符,表示发来的数据已经确认接收无误,最后客户端将ACK发送给服务器。序列号被设置为所接收的确认值Y+1

客户端处于Closed,服务端处于Listen状态

  • 第一次握手
    C----SYN=1,seq=X---->S
    客户端给服务端发送一个SYN报文,指明客户端的初始化序列号ISN。此时客户端处于SYN_SENT状态。
  • 第二次握手
    C<----SYN=1-ACK=1,ack=X+1,seq=Y----S
    服务端收到客户端的SYN报文后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN(s)。同时把客户端的ISN+1作为ACK的值,服务器处于SYN_RCVD状态。
  • 第三次握手
    C----ACK=1,ack=Y+1,seq=X+1---->S
    客户端到SYN报文之后会发送一个ACK报文,此时客户端处于ESTABLISHED状态,服务器收到ACK报文之后也处于ESTABLISHED状态,此时双方建立起了连接。

seq可以理解为我是从哪个位置开始发,ack可以理解为我希望对方下次从哪里开始发。

在socket编程中,客户端执行connect()时,将触发三次握手。
三次握手时,第三次握手是可以带数据的。


为什么需要三次握手

  • 第一次握手:客户端发服务端收。服务端知道客户端发送能力正常,服务端接收能力正常
  • 第二次握手:服务端发客户端收。客户端知道服务端收发能力都正常,自己收发能力正常
  • 第三次握手:客户端发服务器收。服务器知道客户端接收能力正常,自己收发能力正常。

    如果两次握手是没有办法让双方确定自己和对方的收发能力都正常的
  • 三次握手才可以阻止历史重复连接的初始化(主要原因)

RFC 793 指出三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。RFC 793(TCP)文档地址
网络环境是复杂的,不是说先发的包就一定先到。

比如客户端发了一个新的SYN出去,seq=10,结果之前发的有个旧包seq=8到了服务端,服务端会返回给客户端一个SYN-ACK(seq=0,ack=9);然后客户端收到发现不对了,自己期望的ack应该是11,发起了RST报文终止连接。
然后新的SYN到了服务端,就可以开始正常连接了。

  • 同步双方初始序列号

双方都必须维护一个序列号。让:接收方可以去除重复的数据、接收方可以根据数据包的序列号按序接收、可以表示发送出去的包,哪些是已经被对方收到的
需要三次握手双方才能确保双方的初始序列号可靠同步

  • 避免资源浪费

如果两次握手就能建立连接了,那我重复发多次SYN包,就会建立多个冗余的无效连接。

全连接和半连接

在TCP三次握手的时候,Linux内核会维护两个队列:

  • 半连接队列:也称SYN队列
  • 全连接队列:也称accept队列

服务端收到客户端发起的SYN请求后,内核会把该连接存储到半连接队列,并向客户端响应SYN-ACK。然后客户端返回ACK,服务端收到三次握手的ACK后,内核会把连接从半连接队列移除,然后创建新的全连接,添加到全连接队列,等待进程调用accept函数的时候把连接取出来。


SYN攻击

攻击者在三次握手时,短时间伪造不同IP地址的SYN报文,发送给服务端。服务端不停地发SYN-ACK包,但是得不到应答,进而将半连接队列占满,导致服务器无法正常服务。


TCP四次挥手

假设客户端发起关闭请求:

  • 第一次挥手
    C(FIN_WAIT_1)----FIN---->S
  • 第二次挥手
    C<----ACK----S(CLOSE_WAIT)
  • 第三次挥手
    如果服务端也想断开连接
    C(FIN_WAIT_2)<----FIN----S(LAST_ACK)
  • 第四次挥手
    C(TIME_WAIT)----ACK---->S(CLOSED)

四次挥手释放连接等待2MSL的意义
为了保证客户端发送的最后一个ACK报文段能够到达服务器,因为ACK有可能丢失,服务器会超时重传这个FIN_ACK,接着客户端再重传一次确认,重新启动时间等待计时器。

MSL是Maximum Segment Lifetime,译为“报文最大生存时间”
因为TCP报文(segment)是IP数据报(datagram)的数据部分,而IP头中有一个TTL域,TTL是time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个IP数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。

那四次分手又是为何呢
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。
TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。


TCP可靠传输

  • 序列号、确认应答号
  • 校验和
  • 重传机制
  • 流量控制(滑动窗口)
  • 拥塞控制

重传机制

重传也有很多种重传:

  • 超时重传
  • 快速重传
  • SACK
  • D-SACK

超时重传

在发送数据时,设定一个定时器,超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发数据。
发生超时重传的场景有:数据包丢失、确认应答丢失。
超时时间应该设置为:略大于RTT(往返时延,通过采样计算获得),叫RTO。


快速重传

快速重传不以时间为驱动,以数据驱动重传。
收到三次同样的ACK,说明本来应该在这个ACK后面的包一直都没收到。
问题:重传一个还是重传所有?


SACK

选择性确认,在TCP头部选项字段加一个SACK,可以将缓存的地图发送给发送方,这样发送方就知道哪些数据没收到,所以可以只重传丢失的数据。
SACK必须要双方都支持,Linux2.4之后是默认打开的。


D-SACK

Duplicate SACK,使用SACK告诉发送方有哪些数据被重复接收。
因为存在一种情况,其实对方收到数据了,只是应答报文丢失。
可能重复收了好几次同样的数据;或者是网络时延,没丢但是来的太迟了。
Linux2.4后默认打开。


滑动窗口

TCP每发送一个数据,都要进行一次确认应答。当上一个数据包收到应答了,才能发送下一个。但是这种效率非常低,就如果你没回复我,难道我要一直等吗,这不太现实。
所以需要引入 窗口。

窗口大小就是指无需等待确认应答,可以继续发送数据的最大值

窗口实际上是操作系统开辟的一个缓存空间,发送方在等到确认应答返回之前,必须在缓存区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

确认应答\累积应答:假设窗口大小为3个TCP段,并且中途若有ACK丢失,可以通过下一个确认应答进行确定。

窗口大小:TCP头里有一个字段是window,用于让接收方告诉发送方自己还有多少缓存可以接受数据,发送方可以根据这个里发送数据。

发送方的滑动窗口:

  • 已发且回 可以从缓冲区清除了
  • 已发未回 发送窗口
  • 未发可发 可用窗口
  • 不可发 不在缓冲区
    滑动窗口方案使用三个指针来跟踪在四个传输类别中的每一个类别中的字节。

接受窗口大小是约等于发送窗口大小的,但不是完全相等。


流量控制

TCP提供一种机制可以让发送方根据接收方的实际接收能力控制发送的数据量,这就是所谓的流量控制。

流量控制主要是避免发送方是数据填满接收方的缓存。


拥塞控制

拥塞控制的关注点在网络中发生了什么。
当网络中出现拥堵时,继续发包,会更堵。
当堵塞的时候,TCP会自我牺牲,降低发送的数据量。

拥塞窗口:cwnd是发送方维护的一个状态变量,会根据网络的拥塞程度动态变化。

发送窗口swnd和接受窗口rwnd是约等于的关系,引入拥塞窗口,发送窗口的值为swnd = min(cwnd,rwnd)。

网络中没有拥塞,cwnd就会变大,
网络中出现了拥塞,cwnd就减少。

怎样知道网络是否发生了拥塞?
没有收到ACK,不过还是有两种情况,丢了还是网络太挤了。

控制算法:

  • 慢启动:由小到大逐渐增大发送窗口,一点一点提高发送数据包的数量,每当发送方收到一个ACK,cwnd+1。指数增长,到达慢启动门限ssthresh时,为止。
  • 拥塞避免:当拥塞窗口到门限后,每个传输轮次,拥塞窗口cwnd只能线性+1,每收一个ACK,cwnd+1/cwnd,到出现丢包时,说明拥塞了。
  • 拥塞发生:选择超时重传,就会使用拥塞发生算法,门限设置为拥塞窗口的一半,拥塞窗口置1,再慢开始。
    选择快速重传,就是收到3个ACK,TCP认为这种不严重,大部分没丢,拥塞窗口减半,门限设置为拥塞窗口大小。
  • 快恢复:快恢复和快重传一般一起使用,快恢复就是觉得网络情况也没那么糟糕。进入快恢复之前,快重传拥塞算法已经完成了,快恢复算法–>拥塞窗口=门限+3(3是确认有3个数据包收到了),重传丢失的数据包,如果再收到重复ACK,拥塞窗口+1;如果收到新数据的ACK后,设置cwnd为门限,然后进入拥塞避免。

UDP

UDP的全称是User Datagram Protocol,用户数据报协议。
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。

【UDP的特点】

  • 无连接

在发送端,应用层将数据传递给传输层的UDP协议,UDP只会给数据增加一个UDP头标识下是UDP协议,然后就传递给网络层了
在接受端,网络层将数据传递给传输层,UDP只去除IP报文头就传递给应用层,不会任何拼接操作

  • 单播、多播、广播
  • 面向报文
  • 不可靠,还是由于无链接导致的不可靠性
  • 能够支持容忍数据包丢失的带宽密集型应用程序
  • 低延迟
  • 能够发送大量的数据包
  • 允许DNS查找

实时要求高的场景,比如电话会议就需要UDP而不是TCP。

UDP头部格式

UDP的头部开销小,只有八字节

源端口号(16)、目的端口号(16)
包长度(16)、校验和(16)
数据

包长度:该字段保存了UDP首部的长度跟数据的长度之和
校验和:校验和是为了提供可靠的UDP首部和数据而设计


UDP如何可靠传输

可以在应用层模仿传输层TCP的可靠性传输,

  • 添加seq/ack机制,确保数据发送到对端
  • 添加发送和接收缓冲区,用户超时重传
  • 添加超时重传机制

Socket连接过程

  • 开启一个连接之前,需要先完成Socket和Bind两个步骤,
    Socket是新建一个套接字,
    Bind指定套接字的IP和端口(客户端在调用Connect时会由系统分配端口,因此可以省去Bind)
  • 服务端通过Listen开启监听,等待客户端接入
  • 客户端通过Connect连接服务器,服务端通过Accept接收客户端连接,然后进行三次握手
  • 客户端和服务端通过write和read发送和接收数据,操作系统将会完成TCP数据的确认,重发等步骤
  • 通过close关闭连接,操作系统会进行四次挥手


看似是文件,其实是socket的一个连接,万物皆文件。
socket可以得到输入流和输出流。
8是一个文件描述符




IP地址

1、A类IP地址

一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万台。

A类IP地址 地址范围1.0.0.1到127.255.255.254。

2、B类IP地址

一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多台。

B类IP地址地址范围128.0.0.1-191.255.255.254。

3、C类IP地址

一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254台计算机。

C类IP地址范围192.0.0.1-223.255.255.254。

4、D类IP地址

D类IP地址在历史上被叫做多播地址,即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。

5、E类IP地址

E类IP地址中是以“11110”开头,E类IP地址都保留用于将来和实验使用。


CSRF攻击

CSRF跨站点请求伪造,它让用户在一个恶意的Web页面上填写信息,然后自动将表单以攻击受害者的身份提交到另一应用上。

为了防止这种类型的攻击,应用可以在展现表单的时候生成了一个CSRF tocken。


浏览器输入url后发生了什么

  • 浏览器根据输入的URL查找域名是否被本地缓存,有就返回IP。如果没有发起系统调用查询本机hosts文件是否有配置的IP地址,有就返回;没有就向网络中发起一个DNS查询。
  • 首先查询请求会先找到本地DNS服务器来查询有没有,没有就会向根域名服务器发送一个DNS查询。再由根域名服务器-->顶级域名服务器(com,org,edu……)-->权威DNS服务器(baidu.com……)后,由权威服务器告诉本地服务器目标IP地址,在由本地DNS服务器告诉用户要访问的IP地址。
  • 浏览器和目标服务器建立TCP连接,三次握手
  • 建立连接之后,浏览器可以向服务器发起请求,HTTP1.1后默认使用长连接,只需一次握手就可以多次传输数据
  • 如果包含重定向,那就在获取重定向响应之后再带着新URL发起新请求
  • 服务器响应请求,返回报文
  • 浏览器渲染页面呈现给用户

页面刷新为啥还保持原本的位置

本身浏览器设置的优化,如果页面内容没有实质的改变,还是停留在之前位置通过带锚点的URL实现(这种在地址栏中看得见位置)通过js配合诸如cookie信息之类的实现,在加载完后,如果有相应信息进行滚动。


带宽

10M带宽的下载速度?
实际下载速度=带宽/8,理论上的值,10/8=1.25M/S,最大下载速度1.25MB

服务器上行和下行带宽

对服务器而言, 客户端下载资源消耗的是服务器的上行流量,客户端上传资源消耗的是服务器的下行流量,

通常买的服务器,比如阿里云,一般买的带宽指的是上行带宽,下行通常是不限的。而且流量的计算一般都是以上行的来计算的。

所以,客户端上传资源,对服务器的带宽基本没有影响,因为服务器的下行>基本不限的,跟客户端本身网络的带宽有影响;

而客户端下载资源,除了跟服务器的带宽有影响,跟客户端本身的网络带宽也有影响的。

带宽和宽带
带宽是量词,指的是网速的大小,比如1Mbps的意思是一兆比特每秒,这个数值就是指带宽。
宽带是名词,说明网络的传输速率速很高 。宽带的标准各不相同,最初认为128kbps以上带宽的就是宽带,而以下的就是窄带。

但现在国内运营商一般提供至少512kbps带宽的宽带服务。也就是说,带宽是一个具体的数值,而宽带则是满足一定带宽数值的一种传输标准(服务)。
即:宽带是一种业务,带宽是传输速度。

宽带: 在数字通信中通常指64kbit/s以上信号的带宽。窄带:在数字通信中通常指64kbit/s以下信号的带宽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值