reviewNet

Be the best version of you.

网络知识点

笔记本:知识点复习

创建时间: 2017/5/21 15:18 更新时间: 2017/8/6 21:50 作者:

​ 2401503224@qq.com

URL: http://blog.csdn.net/itmacar/article/details/12278769

1、 TCP和UDP的区别与联系,都有哪些应用用到了TCP或UDP协议,各自数据包的特点

2、 TCP如何保证可靠性、以及拥塞避免算法

3、 UDP如何做到保证可靠性

4、 TCP协议的三次握手四次挥手过程,为什么三次握手,为什么在time_wait状态要等待2msl呢?

5、 TCP存在什么危险行为、怎样避免

6、 TCP协议的六种标志,以及什么时候会使用

7、 服务器关闭之后,为什么不能立即重启

8、 http协议格式、以及常见状态码

9、 一次完整的http请求过程

10、 如何解决粘包问题

11、 长连接、短连接、无连接的区别与联系

13、session和cookie

http://blog.csdn.net/lf_2016/article/details/76651337

12、http进阶知识

14、TCP难点和疑点

1、 TCP和UDP的区别与联系,都有哪些应用用到了TCP或UDP协议,各自数据包的特点

  • TCP:是一种面向连接、可靠的、基于数据流、相对比较慢、点对点的传输层协议。TCP协议适用于对可靠性要求比较高的场合。
  • UDP:是一种无连接,不可靠、面向数据报、速度比较快、可实现一对一,多对一的传输层协议。UDP适用于对实时性有要求的场合。因为UDP不保证可靠性,所以UDP也没有重传机制,也没有拥塞机制,他只是尽最大努力交付。
  • TCP数据包特点:

img

  • UDP数据包特点:

img

2、 TCP如何保证可靠性,以及拥塞避免算法

​ TCP 提供一种面向连接、可靠的字节流服务。面向连接意味着两个使用TCP的应用,通常是一个客户和一个服务器,在彼此叫哦换数据之前必须先建立一个TCP链接。TCP通过下列方式提供可靠通信:

  • 将数据截断为合理长度:应用数据被分割成TCP认为最合适发送的数据块(分片)。
  • 超时重传:当TCP发出一个数据包后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。
  • 确认机制:当TCP收到发自TCP链接另一端的数据,将会发送一个确认响应。
  • TCP报文首部的校验机制:当TCP首部的校验和出错时, TCP将丢弃这个报文段和不确认这个报文段。
  • 对失序报文段排序:IP数据报可能会失序,因此TCP对收到的数据进行排序。
  • 丢弃重复数据:IP数据包可能会发生重复。TCP接受端必须丢弃重复的数据。
  • 流量控制:TCP连接的每一方都有固定大小的缓冲空间,这将防止较快主机致使较慢主机的缓冲区溢出。TCP使用的流量控制协议是可变的滑动窗口协议。
  • 拥塞避免算法: 在某段时间,对网络中的某一资源的需求超过了资源所能提供的可用部分,网络的性能就会变坏,这种情况就叫做拥塞。拥塞控制就是为了防止过多的数据注入网络之中,这样可以使网络中的路由器或链路不致过载。和流量控制不同,拥塞控制是一个全局的过程,流量控制是点对点通信量的控制。

慢启动与拥塞避免:

最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由缓存耗尽,从而发生拥塞。因此新建立的链接不能够一开始就大量的发送数据,而只能根据网络情况逐步增加每次发送的数据量。具体来说就是:当新建立链接时,cwnd初始化为1个最大报文(MSS)大小,发送端口开始按照拥塞窗口的大小发送数据,每当有一个报文段被确认之后,cwnd就增加1个MSS大小,这样cwnd的值就随着网络往返时间呈指数级上升。

从慢启动可以看到,cwnd可以很快的增长上 来,从而最大程度的利用网络带宽资源,但是cwnd不能一直无限增大,一定要有一个限制。TCP使用了一个叫做慢启动门限的变量,当cwnd超过慢启动门限的时候,就进入拥塞避免阶段,拥塞避免主要思想就是加法增大,cwnd每次加1。

上面两个机制都是没有检测到拥塞的行为,当检测到拥塞之后(即发生重传),首先把慢启动门限降低为cwnd的一半,然后把cwnd重新设置为1,重新进入到慢启动过程。

快重传与快恢复:

最开始与慢启动和拥塞避免是一样的,只是在发生拥塞之后:当收到3个相同的ACK之后,就进入快速重传阶段,这时把慢启动门限设置为cwnd的一半,再把cwnd设置为当前慢启动门限的值。然后TCP进入的不是拥塞避免阶段,而是快速恢复阶段,快速重传和快速恢复算法一般同时使用,快速恢复的思想是: 数据包守恒原则,即同一个时刻在网络中的数据包数量是恒定的,只有当老的数据包离开网络之后,才能向网络中发送一个新的数据包,如果发送方收到一个重复的ACK,那么根据TCP的ACK 机制就表明有一个数据包离开了网络,于是cwnd加1。

  • 1.当收到 3 个重复 ACK 时,把 ssthresh 设置为 cwnd 的一 半,把cwnd 设置为 ssthresh 的值加 3,然后重传丢失的报文段,加 3 的原因是因为收到 3 个重复的ACK,表明有 3 个“老”的数据包离开了网络。
  • 2.再收到重复的 ACK 时,拥塞窗口增加 1
  • 3.当收到新的数据包的 ACK 时,把 cwnd 设置为第一步中的 ssthresh 的值。原因是因为该 ACK 确认了新的数据,说明从重复 ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。

3、UDP如何做到保证可靠性

  • 方法1:UDP本身是不可靠的协议,而TCP是可靠的协议。所以我们可以参考TCP保证可靠性的策略,对UDP进行改进,保证可靠性。
  • 方法2:UDT协议就是一种保证可靠性的UDP协议。

4、 TCP协议的三次握手和四次挥手过程,为什么要三次握手,为什么在time_wait状态要等待2msl呢,为什么挥手的时候有四次也有三次?

TCP协议的三次握手:

img

TCP 协议的四次挥手:

img

为什么要三次握手:这主要是为了防止已失效的的连接请求报文段。

​ 假设,客户端发出连接请求报文段,但是该连接请求报文段在某个网络节点中长时间滞留,导致客户端因为超时又发送第二个链接请求报文段 。第二个连接请求与服务器建立连接,而第一个连接请求报文段以至于延误到连接释放以后才到达服务器。本来这个连接早已经失效了,如果只采用两次握手的话,服务器会误认为客户端又发送了一次连接请求,从而统一建立连

接。所以,采用三次握手可以很好的避免这个问题。

为什么在 time_wait 状态要等待 2msl:

1、 为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK 状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个

FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待

2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

2、 他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

为什么有时候是三次挥手:

因为假设在服务器发送 ack 给客户端的时候,服务器端已经没有要发送的数据,则这时服务器会将 ACK 捎带在第二次挥手的报文里面,返回回去,也就是第二和第三合在一起发送。

5、 TCP存在什么危险行为,怎么避免

使用 TCP 的时候需要服务器端需要 listen,所以会存在 SYN 洪水攻 击,这时需要设置 backlog 就可以了。还有ARP 欺骗、脚本注入,RST攻击等。

6、 TCP协议中的六种标志,什么时候会用到

TCP 协议中的六个标志分别是,URG、ACK、PSH、RST、SYN、 FIN。

  • UGR(紧急):UGR=1表示紧急指针字段有效。它告诉系统此报文段有紧急数据,应当尽快传送。从报文段的开头,到紧急指针指向的地方就是紧急数据。
  • ACK(确认):ACK=1时,确认号字段才有效。
  • PSH(推送):让对方立即收到响应。与URG的区别就是URG 中的紧急数据不经过缓冲区就直接上交给上层逻辑,而PSH还是要 从缓冲区上交,只是不用等到缓冲区满了才上交。
  • RST(复位):RST=1时,表明TCP链接中出现严重差错,必须释放链接,然后再重新链接。以下几种场景中会使用RST报文(访问不存在的端口。异常终止一个链接,一般情况下是发送FIN,因为在所有排队数据都以发送之后才发送FIN,但是也有可能发送一个RST来异常释放连接。检测半打开的链接,即一端关闭,另一端不知道,这时会发送一个RST进行监测。当长时间不用 连接,连接断开之后,再次访问的时候会发送RST)。
  • SYN(同步):在链接建立时用来同步序号。当SYN=1, ACK=0时表示请求报文。SYN=1,ACK=1表示链接接受。因此SYN=1表示一个链接请求或链接接受报文。
  • FIN(终止):用来释放一个链接。

7、服务器关闭之后为什么不能立即重启

这是由于套接字处于TIME_WAIT状态引起的,这个状态会持续2MSL时间。在TIME_WAIT退出后,套接字被删除,该地址才能被重新绑定而不出现问题。

8、http协议格式、常见的状态码 http协议格式:

img

http 状态码:

状态码由三位数字组成,总共分为 5 类:

  • 1xx: 指示信息 表示请求已接受,继续处理
  • 2xx:成功 表示请求被成功接收、理解、接受
  • 3xx:重定向 要完成请求必须进行更进一步的操作
  • 4xx:客户端错误 请求语法有错误,或请求无法实现 5xx:服务器端错误 服务器未能实现合法的请求

常见的状态码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
200 OK //客户端请求成功
400 BadRequest //客户端请求有语法错误,不能被服务器理解
401 Unauthorized //请求未经授权,这个状态码必须和
WWWAuthenticate 报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 NtoFound //请求资源不存在,也就是输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

9、一次完整的 http 请求过程

数据从应用层,经过 TCP/IP 协议栈封装,经过网卡发送到网络上,根据子网掩码确定对端所在的网络号,到达目的网段的时候在由 arp/rap 得到目标主机得到地址,被目标主机的网卡接受,然后再经过协议栈解包,最后到达对端主机的应用层。

10、如何解决粘包问题

  • 1、 什么是粘包

    从接收缓冲区看,后一包的数据的头部紧接着前一包数据的尾部,使得接收方不能准确的读取一包数据,也就是接收方多读或少读一包数据所造成的现象就是粘包现象。粘包只会在 TCP 的长连接时才可能发生,因为 TCP 是面向字节流的,以流的方式处理数据,当长连接时才可能有多个数据包粘在一起的情况。UDP 是面向数据包的,有固定的消息边界。

  • 2、为什么会有粘包

    粘包既可能是发送方需要等待缓冲区满了之后才发送方数据造成粘包。也可能是接受方来不及接受缓冲区的包,造成多个包一起接收的现象。

    • 发送方造成的粘包: 粘包是由 TCP 协议本身造成的,TCP 协议为了提高传输效率,发送方往往要收集足够多的数据后才发送出去,若是连续几次发送的数据都很少,通常 TCP 会根据算法把这些数据合成一包然后发送出去,这样接收方就出现粘包。
    • 接收方引起的粘包: 接收方会把发送方的数据先放在缓冲区中,应用程序再从该缓冲区中取数据,若是下一包数据到达时前一包数据没有被应用取走,则下一包数据就粘在前一包数据的尾部。应用程序根据预先设定的缓冲区的大小从系统接收缓冲区中取数据,这样就一次提取到多包数据。
  • 3、怎样避免粘包

    我们先来分析一下,http协议中避免粘包的三种方式:

    • 1、 使用回车换行符作为分隔,也就是以空行作为消息报头的结束。
    • 2、 以固定的方式读取消息报头,http 消息报头中每一行都是一个完整内容。
    • 3、 给出数据包的大小,按照大小读取。http 的消息报头中有一个 Content-Length 字段标记了消息正文的大小。

    所以根据 http 协议,我们至少有三种方式来避免粘包:

    1、 添加分隔符,来标识每一包数据的起始和结束。

    2、 发送方将数据结构化,接受方按照结构读取。

    3、发送方在发送的时候,在首部加上数据包的大小,接受方在接受的时候先解析出大小,再按照大小读取数据。

11、长连接、短连接、无连接的区别与联系

长连接:

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

经建立的连接。当然这个连接不会永久的保持下去,他有一个 keep-alive(保活时间)。实现长连接要求客户端和服务器都要支持长连接。

短连接:

img

在HTTP/1.0版本中,默认使用的是短连接,也就是说浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。

HTTP协议的长连接与短连接

HTTP协议的底层使用TCP协议,所以HTTP协议的长连接和短连接在本质上是TCP层的长连接和短连接。由于TCP建立连接、维护连接、释放连接都是要消耗一定的资源,浪费一定的时间。所对于服务器来说,频繁的请求释放连接会浪费大量的时间,长时间维护太多的连接的话又需要消耗资源。所以长连接和短连接并不存在优劣之分,只是适用的场合不同而已。

长连接和短连接的优点和缺点。

长连接可以节省较多的TCP连接和释放的操作,节约时间,对于频繁请求资源的用户来说,适合长连接。由于有保活功能,当遇到大量的恶意连接时,服务器的压力会越来越大。这时服务器需要采取一些策略,关闭一些长时间没有进行读写事件的的连接。

短连接对服务器来说管理比较简单,只要存在的连接都是有效连接,不需要额外的控制手段,而且不会长时间的占用资源。但如果客户端请求频繁的话,会在TCP的建立和释放上浪费大量的时间。

无连接:无连接指的是http层是无连接的。