网络基础复习

 网络协议所在的层

HTTP HTTP2 应用层协议

TCP UDP 运输层

IP 网络层

Ethernet 物理层

IP协议主要解决网络路由和寻址问题

TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。

HTTP与WebSocket

HTTP

HTTP是单向的,客户端发送请求,服务器发送响应。

当客户端向服务器发送请求时,该请求以HTTP或HTTPS的形式发送,在接收到请求后,服务器会将响应发送给客户端。

每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭。

每个HTTP或HTTPS请求每次都会新建与服务器的连接,并且在获得响应后,连接将自行终止。 

HTTP是在TCP之上运行的无状态协议,TCP是一种面向连接的协议,它使用三向握手方法保证数据包传输的传递并重新传输丢失的数据包。

当客户端将HTTP请求发送到服务器时,客户端和服务器之间将打开TCP连接,并且在收到响应后,TCP连接将终止,每个HTTP请求都会建立单独的TCP连接到服务器,例如如果客户端向服务器发送10个请求,则将打开10个单独的HTTP连接。并在获得响应后关闭。


HTTP长连接和短连接

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

每个HTTP连接完成后,其对应的TCP连接并不是每次都会关闭。

从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这个头部字段:Connection:keep-alive。

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache,Nginx,Nginx中这个默认时间是 75s)中设定这个时间。

实现长连接要客户端和服务端都支持长连接。

WebSocket

WebSocket是双向的(基于HTTP协议,使用 101 状态码来切换协议),在客户端-服务器通信的场景中使用的全双工协议,与HTTP不同,它以ws://或wss://开头。

每当我们启动客户端和服务器之间的连接时,客户端-服务器进行握手随后创建一个新的连接,新建的连接被称为WebSocket。

一旦通信链接建立和连接打开后,消息交换将以双向模式进行,客户端-服务器之间的连接会持续存在。

如果其中任何一方(客户端服务器)宕掉或主动关闭连接,则双方均将关闭连接。

套接字的工作方式与HTTP的工作方式略有不同,状态代码101表示WebSocket中的交换协议。

HTTP长连接与WebSocket:

HTTP长连接有保持时间,而WebSocket连接直到服务器或客户端任何一方宕掉或主动关闭连接才关闭连接。

使用情景:

WebSocket:通过网络传输实时更新或连续数据流时使用。

HTTP:不需要很频繁或仅获取一次数据时使用。

三次握手和四次挥手

seq:报文编号
SYN : 表示建立连接
FIN: 表示关闭连接
ACK:  表示是否响应(1表示响应)
ack :表示响应的报文编号+1

三次握手:

确认客户端和服务器的双工性:确定客户端和服务器都有发送和接受报文的能力。

防止网络延时造成的服务器阻塞:如果是两次的话,网络延时导致SYN报文发送两次,使服务器与服务端二次建立连接。

四次挥手:

1.客户端发送一个 FIN 报文,即发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。

2.服务端收到 FIN 之后,会发送 ACK 报文,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

3.如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文。此时服务端处于 LAST_ACK 的状态。

4. 客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,此时客户端处于 TIME_WAIT 状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态,以确保服务端收到自己的 ACK 报文。服务端收到 ACK 报文之后,关闭连接,进入于 CLOSED 状态。

close_wait

close_wait出现在被动关闭方

被动方未及时释放端口资源导致

time_wait

保证TCP协议的全双工连接能够可靠关闭:

为了保证A发送的最后一个ACK报文能够到达B。

这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。

B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。

如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。

这样,B就无法按照正常的步骤进入CLOSED状态。 

保证连接的重复数据段(被动关闭方的fin报文)从网络中消失

A在发送完ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间所产生的所有报文段都从网络中消失。

这样就可以使下一个新的连接中不会出现这种旧的连接请求的报文段。 

tcp流量控制和拥塞控制

udp不需要,不建立连接

流量控制:

通讯双方网速不一样,任何一方发送过快都会导致对方消息处理不过来,所以要把数据放到缓冲区中。

如果缓冲区满了,发送方还在发送,那么接收方就会把数据包丢弃,因此需要控制发送速率

缓冲区剩余大小称为滑动窗口,用变量win表示,如果win为零,那么发送方就停止发送。

缓冲和缓存:

缓冲,存放处理不过来数据,缓和冲击。通俗:吃饭吃不完打包

缓存,加快取用的速度,将常用的数据存到能快速获取的区域。 通俗:把爱吃的菜摆在手边,方便夹。

宏观上说两者可能是混用的。

Buffer的核心作用是用来缓冲,缓和冲击。

缓冲是指在数据流转过程中,不同层次速度不一致时,利用缓冲区来缓解上下层之间速率问题。

比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事。

用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,极大缓和了冲击。

Cache的核心作用是加快取用的速度。

把常用数据存储到可以快速获取的区域,以备重复利用,一般叫做cache, 缓存能提高效率。

 拥塞控制:

与流量控制是两个概念,拥塞控制是调节网络负载。

接收方网络繁忙,因未及时响应ACK,导致发送方以为数据丢失,再次发送大量数据。这样使网络更加拥堵。

拥塞控制是动态调整拥塞窗口的大小,不只是依赖缓冲区的大小确定窗口大小。

拥塞控制包括两部分:

慢开始和拥塞避免

慢开始:指数规律提速(通过增大拥塞窗口大小),试探网络的承受能力。

拥塞避免:达到慢开始的阈值后,进入拥塞避免阶段,每次传输增加1个窗口。

 

快速重传和快速恢复

超时重传:如果发送方一定时间内没有收到ACK确认信息,则会再次发送该报文。

快重传:当接收方收到一个序号大于下一个所期望的报文段时,就会检测到数据流中的一个间隔,于是它就会发送冗余的 ACK,仍然 ACK 的是期望接收的报文段。而当客户端收到三个冗余的 ACK 后,就会在定时器过期之前,重传丢失的报文段。

例如,接收方发现 6 收到了,8 也收到了,但是 7 还没来,那肯定是丢了,于是发送 6 的 ACK,要求下一个是 7。接下来,收到后续的包,仍然发送 6 的 ACK,要求下一个是 7。当客户端收到 3 个重复 ACK,就会发现 7 的确丢了,不等超时,马上重发。

快恢复:把网络负载上限减半作为起点,进入拥塞避免阶段,每次传输增加1个窗口。

粘包、拆包

发生在应用程序到缓冲区过程中的

应用程序写入的数据大于套接字缓冲区大小,将发生拆包。

发生在tcp服务过程中的

待发送的数据>MSS的时候,TCP在传输前将进行拆包。MSS(最大报文长度)

接受方不及时读取套接字缓冲区数据,这将发生粘包

要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。

解决方法:

  1. 发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
  2. 发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
  3. 可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

httpserver处理流程:

httpserver-->http请求-->url-->根据url-->处理函数、对象-->处理结果-->httpServer Socket-->客户端  

网络代理:

正向代理:

正向代理即是客户端代理,  服务端不知道实际发起请求的客户端(VPN)

正向代理类似一个跳板机,代理访问外部资源

  1. 访问原来无法访问的资源,如google
  2. 可以做缓存,加速访问资源
  3. 对客户端访问授权,上网进行认证
  4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息


反向代理:

反向代理即是服务端代理, 客户端不知道实际提供服务的服务端

意义:

  1. 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
  2. 负载均衡,通过反向代理服务器来优化网站的负载。


网络转发和网络代理

网络转发:是路由器对报文的转发操作,中间可能对数据包修改。(客户端的目标ip是实际服务器)

网络代理:用户不直接连接服务器,网络代理去连接,获取数据后返回给用户。(客户端的目标ip是代理地址)
 

HTTP和HTTPS

HTTP:HTTP是超文本传输协议,以明文方式发送内容,不提供任何方式的数据加密,不适合传输一些敏感信息。

HTTPS: HTTPS是安全套接字层超文本传输协议,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS和HTTP的区别主要如下:

  1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https的安全性体现在三点:通信双方的身份认证(证书),报文防篡改(非对称加密),内容加密(非对称加密对称密钥)

 

HTTPS工作原理:

HTTPS采用不对称加密JK+对称加密B

服务器将不对称密钥K交给浏览器(客户端),客户端给服务器一个对称密钥B,之后就通过这个B来进行加密通信。

 

HTTP1/ 1.1/ 2/ 3 

HTTP协议是HyperText Transfer Protocol(超文本传输协议)的缩写,它是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。伴随着计算机网络和浏览器的诞生,HTTP1.0也随之而来,处于计算机网络中的应用层.

HTTP1

HTTP/1.0引入了请求头响应头

同时也引入了状态码,为了减轻服务器的压力,提供了Cache机制。服务器需要统计客户端的基础信息,加入了用户代理字段

HTTP1.1

支持长连接

请求头中增加connection: keep-alive支持,针对同一个tcp进行复用,减少tcp握手带来的时间。

缓存处理

缓存头中提供了更多的属性来支持不同的缓存策略。在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

增加对虚拟主机的支持(Host头处理

HTTP/1.0中每个域名都只绑定唯一的IP地址,因此一个服务器只能支持一个域名。

但是随着虚拟主机技术的发展,一台物理主机上绑定多个虚拟主机的需求大大提升,每个虚拟主机都有自己单独的域名,这些单独的域名都公用同一个IP地址。

因此,请求头中也增加了Host字段,表示当前的域名地址,服务器可根据不同的Host值做不同的处理,支持同一个IP下的不同服务器提供服务。

错误通知的管理

在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

带宽优化及网络连接的使用

HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。

HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

SPDY:HTTP1.x的优化

SPDY的方案优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性,具体如下:

  1. 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。

  2. 请求优先级。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。

  3. header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。

  4. 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。

  5. 服务端推送,采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。SPDY构成图:

HTTP2

HTTP2是基于SPDY设计的,是SPDY的升级版。

、HTTP2.0和HTTP1.X相比的新特性

  • 新的二进制格式,HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  • 二进制分帧,在二进制分帧层上,HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 。

    这样分帧以后这些帧就可以乱序发送,然后根据每个帧首部的流标识符号进行组装。

  • 多路复用,同域名下多个通信可以在单个连接上完成;单个连接可以承载任意数量的双向数据流;数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,最后根据帧首部的流标识可以重新组装某个请求任务耗时严重,不会影响到其它连接的正常执行。

  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

  • 服务端推送 ,同SPDY一样,HTTP2.0也具有server push功能。

HTTP2.0和SPDY的区别:

  1. HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS。(HTTP不加密)

  2. HTTP2.0 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DEFLATE 。

HTTP3

由于HTTP1 HTTP1.x HTTP2都是基于TCP开发的,其中的TCP握手问题就无法避免,为了解决这个问题,Google 就另起炉灶搞了一个基于 UDP 协议的 QUIC 协议,并且使用在了 HTTP/3 上。其特点主要为:

  • 0-RTT,RRT即客户端与服务器之间通讯来回一次所花费的时间,通过QUIC协议可以实现在客户端向服务端发起一次QUIC握手的同时即可完成验证及进行数据的传输,实现了0-RRT。
  • 多路复用,基于UDP实现的多路复用,不存在TCP中的阻塞现象。
  • 加密认证的报文,所有报文头经过了验证,所有报文body经过加密,提高安全性。
  • 向前纠错机制,在传输过程中每个数据包会冗余其他数据其他少量的数据包数据,如果一个包出现了丢包的情况,可以通过其他数据包的数据恢复,在一定程度上降低了错误重传导致的开销。

当访问一个网站时,需要哪些协议?

1. DNS协议,解析ip地址

2. tcp协议,建立tcp连接

3. ip协议,发送数据在网络层使用ip协议

4. OPSF协议: IP数据包在路由器之间,路由选择使用OPSF协议

5. ARP协议:将ip地址转换为MAC地址,需要使用ARP协议

6. HTTP协议:在tcp协议建立完成之后,需要使用HTTP协议访问网页。

HTTP状态码

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误
100Continue继续。客户端应继续其请求
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200OK请求成功。一般用于GET与POST请求
201Created已创建。成功请求并创建了新的资源
202Accepted已接受。已经接受请求,但未处理完成
203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206Partial Content部分内容。服务器成功处理了部分GET请求
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。使用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305Use Proxy使用代理。所请求的资源必须通过代理访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
400Bad Request客户端请求的语法错误,服务器无法理解
401Unauthorized请求要求用户的身份认证
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405Method Not Allowed客户端请求中的方法被禁止
406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408Request Time-out服务器等待客户端发送的请求时间过长,超时
409Conflict服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
412Precondition Failed客户端请求信息的先决条件错误
413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
415Unsupported Media Type服务器无法处理请求附带的媒体格式
416Requested range not satisfiable客户端请求的范围无效
417Expectation Failed服务器无法满足Expect的请求头信息
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功能,无法完成请求
502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

HTTP报文解析

HTTP请求报文:

报文头内:Accept:接受类型 Content-Type:报文内容类型

 HTTP响应报文:

报文头内:Content-Type:报文内容类型

转发和重定向

转发:在服务器内部发生跳转,客户端只发送一次请求。

重定向:在浏览器(客户端)发生跳转,客户端发送两次请求。

linux查看ip地址

查看ip地址 ifconfig 或者  ip addr

IP地址是可更换的,而MAC地址是为一且固定的

IP 是地址,有定位功能;MAC 是身份证,无定位功能;

一个IP地址去访问另一个IP地址

Linux 首先会判断,访问的这个IP地址和自己的IP地址是一个网段的吗,或者和自己的一个网卡是同一网段的吗?只有是一个网段的,它才会发送 ARP 请求,获取 MAC 地址。

如果不是一个网段,Linux 默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关。

网关要和当前的网络至少一个网卡是同一个网段的。

网段:指一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分。

如何判断是否在一个网段:判断IP地址与子网掩码与操作得来的网络号是否一致。

广播地址:主机号全为1的ip地址

动态主机配置协议(DHCP)

自动地配置ip地址,每一个主机进入一个网段后,都会被DHCP分配一个IP地址,用完后退出去。

TCP 和 UDP 有哪些区别? 

1.TCP 是面向连接的,UDP 是面向无连接的。

所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。

2.TCP 提供可靠交付。通过 TCP 连接传输的数据,无差错(通过校验和来保证报文正确未修改)、不丢失、不重复、并且按序到达。

UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。

3.TCP 是面向字节流的。发送的时候发的是一个流,没头没尾。IP 包可不是一个流,而是一个个的 IP 包。之所以变成了流,这也是 TCP 自己的状态维护做的事情。而 UDP 继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收。

4. TCP 是可以有拥塞控制的。它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点。UDP 就不会,应用让我发,我就发,管它洪水滔天。

因而 TCP 其实是一个有状态服务,通俗地讲就是有脑子的,里面精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行。而 UDP 则是无状态服务。通俗地说是没脑子的,天真无邪的,发出去就发出去了。


UDP 完全继承了底层MAC协议和IP协议特性,几乎没有自己特别的规则。而TCP对数据有自己的规则约束。

TCP包头格式

 序号:TCP是有序报文,所以要给报文排序。

TCP 包头很复杂,但是主要关注五个问题,顺序问题,丢包问题,连接维护,流量控制,拥塞控制;

TCP 包的序号

三次握手除了双方建立连接外,主要还是为了沟通一件事情,就是 TCP 包的序号的问题。

A 要告诉 B,我这面发起的包的序号起始是从哪个号开始的,B 同样也要告诉 A,B 发起的包的序号起始是从哪个号开始的。

为什么序号不能都从 1 开始呢?因为这样往往会出现冲突。

例如,A 连上 B 之后,发送了 1、2、3 三个包,但是发送 3 的时候,中间丢了,或者绕路了,于是重新发送,后来 A 掉线了,重新连上 B 后,序号又从 1 开始,然后发送 2,但是压根没想发送 3,但是上次绕路的那个 3 又回来了,发给了 B,B 自然认为,这就是下一个包,于是发生了错误。

因而,每个连接都要有不同的序号。这个序号的起始序号是随着时间变化的,可以看成一个 32 位的计数器,每 4 微秒加一,如果计算一下,如果到重复,需要 4 个多小时,那个绕路的包早就死翘翘了,因为我们都知道 IP 包头里面有个 TTL,也即生存时间。

ACK累计应答

TCP 协议使用的也是同样的模式。为了保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。为了保证不丢包,对于发送的包都要进行应答,但是这个应答也不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,这种模式称为累计确认或者累计应答。

顺序问题与丢包问题

超时重传:如果发送方一定时间内没有收到ACK确认信息,则会再次发送该报文。

快重传:当接收方收到一个序号大于下一个所期望的报文段时,就会检测到数据流中的一个间隔,于是它就会发送冗余的 ACK,仍然 ACK 的是期望接收的报文段。而当客户端收到三个冗余的 ACK 后,就会在定时器过期之前,重传丢失的报文段。

例如,接收方发现 6 收到了,8 也收到了,但是 7 还没来,那肯定是丢了,于是发送 6 的 ACK,要求下一个是 7。接下来,收到后续的包,仍然发送 6 的 ACK,要求下一个是 7。当客户端收到 3 个重复 ACK,就会发现 7 的确丢了,不等超时,马上重发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值