TCP协议-相关面试题

一、TCP协议简介

一般问到TCP协议的时候 最常见的是TCP连接建立和断开的过程,也就是三次握手和四次挥手,两张图足矣。

1.1 三次握手

4220220[1].png

1.2 四次挥手

1363876245_7915[1].JPG

二、常见面试题

2.1 TCP连接阶段

2.1.1 发送序号和确认序号问题

例: TCP建立连接的过程采用三次握手,已知第三次握手报文的发送序列号为1000,确认序列号为2000,请问第二次握手报文的发送序列号和确认序列号分别为?
答:看答案时请参考上面TCP连接建立的图。
客户端:发送X
服务端:发送Y, 确认X+1
客户端:发送X+1(1000),确认Y+1(2000)
可以反推第二次为1999,确认1000

2.1.2 SYN Flood 攻击原理及防御

SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。

原理:
问题出在TCP连接的三次握手中,恶意的攻击者大量发送SYN报文,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。
攻击方式:

  1. Direct Attack 攻击方使用固定的源地址发起攻击,这种方法对攻击方的消耗最小
  2. Spoofing Attack 攻击方使用变化的源地址发起攻击,这种方法需要攻击方不停地修改源地址,实际上消耗也不大
  3. Distributed Direct Attack 这种攻击主要是使用僵尸网络进行固定源地址的攻击

防御方法:

  1. 无效连接监视释放
    不停监视系统的半开连接和不活动连接,当达到一定阈值时拆除这些连接,从而释放系统资源。
  2. 延缓TCB分配方法
    从前面SYN Flood原理可以看到,消耗服务器资源主要是因为当SYN数据报文一到达,系统立即分配TCB,从而占用了资源。而SYN Flood由于很难建立起正常连接,因此,当正常连接建立起来后再分配TCB则可以有效地减轻服务器资源的消耗。常见的方法是使用Syn Cache和Syn Cookie技术。
    Syn Cache技术:
    这种技术是在收到SYN数据报文时不急于去分配TCB,而是先回应一个SYN ACK报文,并在一个专用HASH表(Cache)中保存这种半开连接信息,直到收到正确的回应ACK报文再分配TCB。
    Syn Cookie技术:
    Syn Cookie技术则完全不使用任何存储资源,它使用一种特殊的算法生成Sequence Number,这种算法考虑到了对方的IP、端口、己方IP、端口的固定信息,以及对方无法知道而己方比较固定的一些信息,如MSS、时间等,在收到对方的ACK报文后,重新计算一遍,看其是否与对方回应报文中的(Sequence Number-1)相同,从而决定是否分配TCB资源。
  3. 使用SYN Proxy防火墙
    防火墙中提供一种SYN代理的功能,主要原理是对试图穿越的SYN请求进行验证后才放行。

2.1.3 为什么TCP建立连接要三次握手

首先得回答三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。
然后可以回答为什么两次握手不行,两次握手可能因为丢包而出现死锁,假设在两次握手场景中,C向S发送请求,S收到并发送确认请求给C,这时候S认为连接已经建立,并开始发送数据给C,但是那个确认请求丢包了,C不认为请求建立了,C当然会拒绝接受S发送来的数据,并且再去请求连接。这样,一个资源就死锁了。
最后回答握手当然可以四次五次一直握下去,但三次已经够了,就没有必要了。
总结下来一句话,主要目的防止在网络发生延迟或者丢包的情况下浪费资源。

详情请移步 TCP为什么要三次握手,不是两次四次

2.2 TCP传输阶段

2.2.1 滑动窗口以及拥塞控制

TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。

详情请移步 tcp窗口滑动以及拥塞控制

2.3 TCP断开阶段

2.3.1 设置TIME_WAIT的原因

  1. 可靠地实现TCP全双工连接的终止
    TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
    因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态
  2. 允许老的重复分节在网络中消逝
    TCP分节可能由于路由器异常而“迷途“,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

2.3.2 大量 TIME_WAIT 产生的原因及解决办法

原因:对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可想而知,对于访问量大的Web Server,会存在大量的TIME_WAIT状态。

解决办法:

  1. 开启socket重用,允许将TIME_WAIT的socket重新用于TCP连接
  2. 开启快速回收。

2.3.3 大量CLOSE_WAIT产生的原因及解决办法

原因:对方关闭连接之后服务器程序自己没有进一步发出ack信号。换句话说,就是在对方连接 关闭之后,程序里 没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直被程序占着。
解决办法:
具体问题具体解决,总结一句话就是在处理资源时一定要记住自己申请的资源要记得主动释放。
详情请移步 再谈应用环境下的TIME_WAIT和CLOSE_WAIT

2.3.4 为什么TCP断开连接要四次挥手

因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。
详情请移步 TCP为什么需要3次握手与4次挥手

2.4 其他

2.4.1 出现RST包的原因

RST:TCP首部中的6个标志比特之一,表示重置连接、复位连接。

  1. 服务器端口未打开而客户端来连接时
  2. 在一个已关闭的SOCKET上收到数据
  3. 请求超时
  4. 提前关闭

详细请移步 几种TCP连接中出现RST的情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

稚晖君又整活啦!基于全志F1C200s的超迷你

转自全志在线B站最强小电视(基于全志H3)钢铁侠机械臂曾经靠着“B站最强小电视”以及号称“钢铁侠机械臂”等硬核产品出圈的稚晖君又双叒叕来整活啦!稚晖君B站首页这次稚晖君开源了基于全志F1C200s的一个超迷你&低成本的Linux开发板&#…

分布式为什么使用Redis

一 为什么使用 Redis 在项目中使用 Redis,主要考虑两个角度:性能和并发。如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis。 性能: 如下图所示,我们在碰到需要执行…

困扰多年的PCB散热问题终于可以解决了!

做电子的同学应该都会知道电路板,电路板分为基板导电部分组成。如下图,我们普通的单层电路板是一块有机材料加上导电铜层组成的。在大学那会我们会用面包板来做一些基础的实验,用面包板做实验可以减少打PCB板的时间,因为制作一个P…

进程之间的通信方式-共享内存

共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。原理图如下: 共享内存的实现分为两个步骤: 一、…

和一个刚毕业不久的朋友聊天

我记得还在你上大学的时候,我们就开始联系了,想不到的是你已经毕业半年多。我相信每个人都会有经历从学生到工作的过程,当然肯定也会因为工作后面对很多不一样的人和事,我也希望能够通过我们的一次对话,让没有毕业的同…

ListView中convertView和ViewHolder的工作原理

w和Adapter参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html工作原理:1.ListView针对List中每个item,要求adapter给我一个视图(getView)2.一个新的视图被返回并显示如果我们有上亿个item要显示怎么办?为每…

RTOS 任务间互斥的难题

作者 | strongerHuang微信公众号 | 嵌入式专栏在基于RTOS开发项目时,通常都会遇到互斥的情况,比如:几个任务都要使用一个UART串口进行发送数据。如果不加互斥锁,优先级高的任务,会抢占串口并发送数据,则有可…

android中绘图Paint.setAntiAlias()和Paint.setDither()方法的作用

转载:http://blog.csdn.net/lovexieyuan520/article/details/50732023 在自定义View中,这两个Paint.setAntiAlias()和Paint.setDither()方法用的很多,都只有一个boolean值,作用大家未必清楚,今天抽了点时间研究下&…

简单分析STM32和51的区别

分享本文,简单分析STM32与51单片机的区别与取舍之处。单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口…

深圳,四月

我是一个工程师,每天有干不完的活,做不完的事情,还有加不完的班!认识的一个同学要去北京,我们昨天一块吃饭,他说了未来的计划,他说让我去北京了去找他,他还说让我把地址给他&#xf…

OOB与COM交互读写本地文件

相信读过前几篇Silverlight Out of Browser实例教程的朋友已经对Silverlight的OOB应用有了一定的认识和了解。今天,我们将讨论Silverlight Out of Browser的另外一个功能实例,Silverlight OOB与COM API的交互操作。在开始实例之前,我们先了解…

在Google工作的十年,也是我开心的十年

大家好,我是写代码的篮球球痴,昨晚看到bug君发的这篇文章,文章的主人公在Google工作了10年,我认真看了文章里的每一个字,我特别羡慕这样的工作和环境,当然,我相信我们有一天也会是这样的&#x…

纠结

几年前,我一同事回家创业,当时我们一起做软件开发,他觉得上班没意思,就决定回老家创业,当时他创业的项目是零售项目,离职回去筹备了几个月,跟我们看到的创业老板一样,当时他也去挖了…

RTSP的报文结构

RTSP的报文结构 RTSP是一种基于文本的协议,用CRLF作为一行的结束符。使用基于文本协议的好处在于我们可以随时在使用过程中的增加自定义的参数,也可以随便将协议包抓住很直观的进行分析。 RTSP有两类报文:请求报文和响应报文。请求报文是指从…

Qt性能优化,一位资深Qt工程师的经验

Qt是一个1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智嵌入式系统 QN…

计算机指令称,通俗解释什么叫计算机指令?

实际上能接触到“计算机指令”的人,只是少数电脑工程师。现在一般的电脑程序员都已经无需使用计算机指令了,因为他们编程序已经使用高级的计算机语言了。下面我尽量用通俗的语言来试着解释。计算机由CPU、内存、硬盘、显示器和键盘等部件组成。计算机软件…

STM32和Arduino对比,谁更厉害?

前两天有一个同学问我嵌入式的学习路线他是一个大三的学生,我看了他的简历,里面几乎没什么项目经验,对于企业来说这样的学生就好比一张白纸一样,当然,这样的学生很难拿到一份好的offer。学习路线的文章我记得已经发了很…

人大计算机在职考研好考吗,人大在职研究生好考吗?通过率高吗?

答:最近咨询人大在职研究生进行学习的人非常多,其中咨询最多的问题是考试难度及通过率。下面就通过在职研究生招生信息网为大家介绍一下,人大在职研究生好考吗?通过率高吗?人大在职研究生招生是采用同等学力申硕的方式,该方式是…

可能你还不懂浮点数

在网上看到一个问题然后看到这篇关于浮点数的文章,希望大家看了之后有所启发想一下,为什么第一个打印的和预设值不同,但是第二个是相同的?如图:尾数部分是如何转变成二进制的?前言很多人在初学写程式时都会…

RTP协议的封装

最近一段时间学习了RTP协议相关的内容,一方面为了将自己学到的部分记录下来,便于后续查找,另一方面用于记录笔记 一个协议的封装是为了满足协议的功能需求的。从前面提出的功能需求,可以推测出RTP封装中应该有同步源和时戳等字段&…