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,一经查实,立即删除!

相关文章

Android RIL源码研究笔记 の ril (一)

Android源码目录hardware/ril/libril中总共包含5个C/CPP文件,它们分别是ril_commands.h、ril_unsol_commands.h、ril_event.h、ril_event.cpp和ril.cpp。这篇文章主要分析ril.cpp文件。 我们可以将该文件划分为定义部分和实现部分,先来看定义部分&#x…

[转载]Manually configuring Microsoft Internet Information Services (IIS)

Manually configuring Microsoft Internet Information Services (IIS) 原文摘自http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic/com.ibm.websphere.base.doc/info/aes/ae/tins_manualWebIIS.html This topic describes manual configuration setti…

生活中的计算机趣味知识大全,五个有趣的电脑小知识

五个有趣的电脑小知识1, 更改临时文件夹的路径问:我使用的系统为Windows XP,我想把系统临时文件(Temp文件)存放区由C盘移到其他分区(如D盘),请问该如何*作?答:在“我的电脑上点鼠标右键,选择“属…

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

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

分布式为什么使用Redis

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

手动添加mysql服务

重新安装系统以后不再重新安装mysql 只需要我们把mysql服务添加到系统服务里即可,一下是具体步骤: 安装mysql服务 新建并编辑内容如下的一个bat文件,并且执行(盘符:\mysql\bin\mysqld-nt.exe为安装目录,按实际情况填写,如果安装路径里面有空格…

心情

今天有些沮丧。 突然想起一句话: 千山暮雪,形影相吊! 不知道是因为想起这句话才沮丧,还是因为心情差才想起这句话。 转载于:https://www.cnblogs.com/armlinux/archive/2006/12/20/2391047.html

微型计算机突然断电什么信息全部都是,微型计算机的硬件组成阶段作业(函授2014春).doc...

微型计算机的硬件组成阶段作业(函授2014春)微型计算机的硬件组成一、单项选择题(共15道小题,共15.0分)下列叙述中,错误的一个是个人微型计算机键盘上的Ctrl键是起控制作用的,它必须与其他键同时按下才有作用个人微型计算机在使用过程中突然断…

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

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

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

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

第4天:调用样式表

用web标准设计网站,过渡的方法主要是采用XHTMLCSS,css样式表是必不可少的。这就要求所有网页设计师必须熟练掌握CSS,如果你以前不常用,那么现在就开始学习吧。要制作符合web标准的网站,不懂CSS是设计不出漂亮的页面的。…

获取url参数值(可解码中文值)

/*** 根据指定参数名称获取参数值* param {String} urlStr 参数名称* return {Object} 参数值* */ getUrlParams function (urlStr) {// 获取url中"?"符后的字串let url urlStr || location.href;let params {};if (url.indexOf(?) ! -1) {let str url.sub…

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

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

大工奥鹏计算机在线作业,大工20春《计算机网络技术》在线作业1题目【标准答案】...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼大工20春《计算机网络技术》在线作业1试卷总分:100 得分:100一、单选题 (共 10 道试题,共 50 分)1.网络协议是通信双方必须遵守的事先约定好的规则,一个网络协议由语法、语义和 ( ) 三部分组成。A.逆序B.次数C.时序D.词序2.运输层的…

xflash里的hello world程序

下面是hello world实例,虽然看起来与html里的按钮一样,但是,xflash里所有的元素都和页面无关,是纯flash的。从代码看,使用起来还是比较简单的,只需要包含xflash.js文件就可以满足进一步的开发要求了。 具体…

ListView中convertView和ViewHolder的工作原理

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

简单的for()循环使用方式foreach

知识点: 1、foreach使用。 2、小数随机数的生成,Random.nextFloat()。 3、将字符串转化为字符数组,String.toAharArray()。 Java SE5引入了一种新的更加简洁的for语法用于数组和容器,即foreach语法,表示不必创建int变量…

RTOS 任务间互斥的难题

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

武汉工程大学计算机学院研究生难吗,武汉工程大学考研难吗?一般要什么水平才可以进入?...

问:从武汉工程大学毕业的学生就业怎么样?值不值得报考?答:2020年武汉工程大学就业质量报告未公布,从2019年武汉工程大学就业质量报告来看:2019届硕士毕业生就业463人,就业率为95.66%。2019届研究…

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

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