1. TCP为什么要三次握手,能两次吗?⭐⭐⭐⭐⭐

  2. TCP为什么要四次挥手,能三次吗?⭐⭐⭐⭐⭐

  3. 说说TCP三次握手的过程。⭐⭐⭐⭐⭐

  4. 说说TCP四次挥手的过程。⭐⭐⭐⭐⭐

  5. 为什么第四次挥手后,客户端需要等待2MSL? ⭐⭐⭐⭐⭐

  6. 什么是洪泛攻击?怎么避免?⭐⭐⭐⭐⭐

  7. 如何应对短连接、高并发的场景?⭐⭐⭐⭐⭐

  8. 说说TCP的可靠机制。⭐⭐⭐⭐⭐

  9. 请说说TCP的ACK机制,有什么好处?⭐⭐⭐⭐⭐

  10. 如何让UDP也变得可靠?⭐⭐⭐⭐⭐

  11. 什么是负载均衡?⭐⭐⭐⭐⭐

  12. Session和cookie的区别?⭐⭐⭐⭐⭐

  13. 网络调试的工具?⭐⭐⭐⭐⭐

=========================================================================================================

  • 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。
  • 本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。
  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
  • 针对于非科班同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。
  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。

=========================================================================================================

  1. TCP为什么要三次握手,能两次吗?⭐⭐⭐⭐⭐

    不能两次

    假如只进行两次握手,客户端发送连接请求后,会等待服务器端的应答。但是会出现的问题是,假如客户端的SYN迟迟没有到达服务器端,此时客户端超时后,会重新发送一次连接,假如重发的这次服务器端收到了,且应答客户端了,连接建立了。

    但是建立后,第一个SYN也到达服务端了,这时服务端会认为这是一个新连接,会再给客户端发送一个ACK,这个ACK当然会被客户端丢弃。但是此时服务器端已经为这个连接分配资源了,而且服务器端会一直维持着这个资源,会造成资源浪费。

    两次握手的问题在于服务器端不知道SYN的有效性,所以如果是三次握手,服务器端会等待客户端的第三次握手,如果第三次握手迟迟不来,服务器端就会释放相关资源

  2. TCP为什么要四次挥手,能三次吗?⭐⭐⭐⭐⭐

    不能三次。

    第二次挥手和第三次挥手不能合并在一起,这是因为第二次挥手后,服务器端可能还在传输数据,需要等待数据传输完毕后再进行第三次挥手。

  3. 说说TCP三次握手的过程。⭐⭐⭐⭐⭐

    三次握手

    1. Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,等待Server确认。
    2. Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置1,ack=J+1,随机产生一个值seq=K,并将该数据包发给Client以确认连接请求。
    3. Client收到确认后,检测ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server。完成三次握手,随后Client与Server之间可以开始传输数据了。 图片说明
  4. 说说TCP四次挥手的过程。⭐⭐⭐⭐⭐

    四次挥手

    1. 数据传输结束后,Client的应用进程发出连接释放报文段FIN,并停止发送数据,此时Client依然可以接收Server发送来的数据。
    2. Server接收到FIN后,发送一个ACK给Client,确认序号为收到的序号+1。
    3. 当Server没有数据要发送时,Server发送一个FIN报文,等待Client的确认。
    4. Client收到Server的FIN报文后,给Server发送一个ACK报文,确认序列号为收到的序号+1。此时Client进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接。
  5. 为什么第四次挥手后,客户端需要等待2MSL? ⭐⭐⭐⭐⭐

    这是为了保证客户端发送的最后一个ACK报文段能够到达服务器。如果客户端不等待2MSL,这个ACK报文段可能丢失,因而使得处在LAST-ACK状态的服务器收不到ACK报文段的确认,导致服务器无法正常关闭。而如果客户端等待2MSL,服务器就会超时重传FIN报文段,而客户端就能在2MSL时间内收到这个重传的FIN-ACK报文段。接着客户端重传一个确认,重新启动2MSL计时器。当服务器收到最后一个ACK后就可以正常关闭了。

    2MSL的意义是,经过2MSL后,所有的报文都会消失,不会影响下一次连接。最后客户端和服务器端都能正常进入到CLOSED状态。

  6. 什么是洪泛攻击?怎么避免?⭐⭐⭐⭐⭐

    A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当这个服务器返回ACK以后,A不再进行确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器收不到再确认的一个消息,还会重复发送ACK给A。

    这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。

    避免方法:

    最常用的一个手段就是优化主机系统设置。

    (1)比如降低SYN timeout时间,使得主机尽快释放半连接的占用。

    (2)或者采用SYN cookie设置,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被丢弃。Cookie是当浏览某网站时,由Web服务器置于硬盘上一个非常小的文本文件,用来记录用户ID,密码,浏览过的网页,停留时间等信息。当我们认为受到了攻击,合理的采用防huo墙(汉字竟然会被屏蔽,有点意思,只能打拼音了)设置等外部网络进行拦截。

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

  7. 如何应对短连接、高并发的场景?⭐⭐⭐⭐⭐

    1. 针对于大量短连接同时高并发的情况: 最常用的一个手段就是优化主机系统设置。

      (1)比如降低SYN timeout时间,使得主机尽快释放半连接的占用。

      (2)或者采用SYN cookie设置,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被丢弃。Cookie是当浏览某网站时,由Web服务器置于硬盘上一个非常小的文本文件,用来记录用户ID,密码,浏览过的网页,停留时间等信息。当我们认为受到了攻击,合理的采用防huo墙(汉字竟然会被屏蔽,有点意思,只能打拼音了)设置等外部网络进行拦截。

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

    2. 而针对于服务器高并发的场景,有以下处理手段: (1)采用多IO复用模型,如select、epoll,甚至采用异步IO

      (2)采用队列进行削峰、缓存

      (3)采用多服务器负载均衡手段

      (4)数据库层面我们可以采用分库分表、读写分离等措施。

      (5)还可以采用缓存的方式

  8. 说说TCP的可靠机制。⭐⭐⭐⭐⭐

    TCP保证可靠性

    1. 序列号、确认应答、超时重传

      数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序列号,序列号说明了它下一次需要接收的数据序列号,保证数据传输有序。如果发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一段时间后进行重传。

    2. 窗口控制

      TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。

      使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;数据一旦丢失,接收端会一直提醒。

    3. 拥塞控制

      如果把窗口定的很大,发送端连续发送大量的数据,可能造成网络的拥堵。为了防止拥堵,进行拥塞控制。

      (1)慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到一次确认应答(一次成功来回传输),将拥塞窗口大小 乘以2,呈指数增长。

      (2)拥塞避免:设置慢启动阈值,一般开始都设为65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是+1,让其缓慢增加。

      (3)快恢复:将报文段的超时重传看做拥塞,则一旦发生超时重传,我们就将阈值设为当前窗口大小的一半,并且窗口大小也变为原来窗口大小一半,如果收到新的ACK,表明重传的包成功了,那么退出快速恢复算法,进入拥塞避免算法

      (4)快速重传:数据一旦丢失,接收端会一直提醒。发送3次重复确认应答,发送端收到后立即重传数据包,不用等待超时。

      alt

  9. 请说说TCP的ACK机制,有什么好处?⭐⭐⭐⭐⭐

    由于通信过程的不可靠性,传输的数据不可避免的会出现丢失、延迟、错误、重复等各种状况,TCP协议为解决这些问题设计了一系列机制。这个机制的核心,就是发送方向接收方发送数据后,接收方要向发送方发送ACK(回执)。如果发送方没接收到正确的ACK,就会重新发送数据直到接收到ACK为止。

    比如:发送方发送的数据序号是seq,那么接收方会发送seq + 1作为ACK,这样发送方就知道接下来要发送序号为seq + 1的数据给接收方了。

  10. 如何让UDP也变得可靠?⭐⭐⭐⭐⭐

    加入TCP可靠性机制

    1. 序列号、确认应答、超时重传

      数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序列号,序列号说明了它下一次需要接收的数据序列号,保证数据传输有序。如果发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一段时间后进行重传。

    2. 窗口控制

      TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。

      使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;数据一旦丢失,接收端会一直提醒。

    3. 拥塞控制

      如果把窗口定的很大,发送端连续发送大量的数据,可能造成网络的拥堵。为了防止拥堵,进行拥塞控制。

      (1)慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到一次确认应答(一次成功来回传输),将拥塞窗口大小 乘以2,呈指数增长。

      (2)拥塞避免:设置慢启动阈值,一般开始都设为65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是+1,让其缓慢增加。

      (3)快恢复:将报文段的超时重传看做拥塞,则一旦发生超时重传,我们就将阈值设为当前窗口大小的一半,并且窗口大小也变为原来窗口大小一半,如果收到新的ACK,表明重传的包成功了,那么退出快速恢复算法,进入拥塞避免算法

      (4)快速重传:数据一旦丢失,接收端会一直提醒。发送3次重复确认应答,发送端收到后立即重传数据包,不用等待超时。

      alt

  11. 什么是负载均衡?⭐⭐⭐⭐⭐

    当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。

    什么是负载均衡:我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

    负载均衡有几种方式实现

    (1)轮询(默认) 请求依次轮流往每个应用服务器上进行分配,分配策略比较简单。 缺点:不均匀,可能会出现,某些服务器接受的请求较重,负载压力重,有些负荷小,不可控。另外服务器之间需要进行session同步。

    (2)权重轮询(权重越高,进入的几率越大) 优点:可以根据情况进行调整。可控,仍然需要进行session同步。

    (3)IP-Hash 优点:采用hash的方式来映射服务器。无需进行session同步,固定IP会固定访问一台服务器。 缺点:恶意攻击,会造成某台服务器压垮。提供的服务不同,面向的地区不同,IP可能会出现集中,造成不均匀,不可控。

    (4)Fair 这种相当于自适应,会根据服务器处理请求的速度进行负载均衡分配。处理请求最早结束的,拿到下一个请求。看上去是不是很好。但是一般都不使用,说是考虑到网络不稳定因素。还有待研究。这种也需要进行session同步。

    (5)URL-Hash 这种是根据URL进行hash,这样某些请求永远打某台服务器。利于利用服务器的缓存,但是可能由于URL的哈希值分布不均匀,以及业务侧重造成某些服务器压力大,某些负荷低。这种也需要进行session同步。

  12. Session和cookie的区别?⭐⭐⭐⭐⭐

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

    Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie

    客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

    实际就是颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

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

    而 Session 的出现正是为了解决这个问题。同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 是客户端第一次访问服务器的时候生成的, 而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NANE 为JSESIONID 的一个 Cookie。

    区别

    1、数据存放位置不同:cookie数据存放在客户的浏览器上,session数据放在服务器上。

    2、安全程度不同:cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

    3、性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

    4、数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。

    5、会话机制不同 session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。

    cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie。

  13. 网络调试的工具?⭐⭐⭐⭐⭐

    1. Ping命令:ping属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否通畅或者网络连接速度,很好地分析和判定网络故障。

      它的原理是:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,通过对方回复的数据包来确定两台网络机器是否连接相通,时延是多少。

    2. Nslookup(name server lookup)是一个用于查询因特网域名信息或诊断DNS 服务器问题的工具.

    3. Fiddler(中文名称:小提琴)是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动,Fiddler可以也可以让你检查所有的HTTP通讯,设置断点,以及Fiddle所有的“进出”的数据

    4. 网站压力测试工具——webbench

##豆芽点评 TCP挥手和握手考点多,也很重要,全是五颗星,一定要掌握。