一、TCP协议简介

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

1.1 三次握手

1.2 四次挥手

二、常见面试题

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的情况

TCP协议-相关面试题相关推荐

  1. Java—— TCP协议(相关代码实现以及相关优化)

    代码运行的时候先运行服务端,然后在运行客户端 * TCP协议:* 1,客户端* 创建Socket连接服务器(指定IP地址,端口号)通过IP地址找到对应的服务器* 调用Socket的getInputSt ...

  2. TCP/IP相关面试题

    1. 什么是TCP/IP协议?它的作用是什么? TCP/IP(Transmission Control Protocol/Internet Protocol)互联网中最常用的协议,是计算机网络通信的基 ...

  3. TCP协议相关属性设置之SO_DONTLINGER属性

    对于有些协议来说支持套接字的"安全"关闭.当套接字关闭时,为了不造成尚未传输完毕的数据的丢失,所以会经历TIME_WAIT状态.在这段时间之内客户端调用connect函数进行连接时 ...

  4. TCP协议连环12问

    本文分享下TCP协议常见面试题,看下你是不是都已经掌握了.TCP 作为传输层的协议,是一个软件工程师素养的体现,也是面试中经常被问到的知识点.在此,我将 TCP 核心的一些问题梳理了一下,希望能帮到各 ...

  5. 易语言tcp多线程服务端客户端_从TCP协议到TCP通信的各种异常现象和分析

    很多人总觉得学习TCP/IP协议没什么用,觉得日常编程开发只需要知道socket接口怎么用就可以了.如果大家定位过线上问题就会知道,实际上并非如此.如果应用在局域网内,且设备一切正常的情况下可能确实如 ...

  6. lwIP TCP/IP 协议栈笔记之十五: TCP协议

    目录 1. TCP 服务简介 2. TCP 的特性 2.1 连接机制 2.2 确认与重传 2.3 缓冲机制 2.4 全双工通信 2.5 流量控制 2.6 差错控制 2.7 拥塞控制 3. 端口号的概念 ...

  7. TCP协议 “3次握手,4次挥手” 详细解释

    什么是"3次握手,4次挥手" TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接.所谓的"连接",其实是客户端和服务器的内存里保存的 ...

  8. Visual C#TCP协议编程

    Visual C#TCP协议编程 Visual C# TCP协议编程基础 TCP协议层次结构 TCP协议规范 TCP协议相关类简介 TcpListener TcpClient NetworkStrea ...

  9. 计算机网络课程设计--基于TCP协议网上聊天程序--python实现带图形界面--socket--多线程

                                              基于TCP协议网上聊天程序 引言 21世纪是一个以网络为核心的信息时代,要实现信息化,就必须依靠完善的网络.而随着计 ...

最新文章

  1. linux下echo命令详解(转)
  2. Kitten编程猫 里的一步积木设计原理
  3. Python矩阵的用法(使用numpy)
  4. MongoDB 定位 oplog 必须全表扫描吗?
  5. Linux基本命令 -- grep参数说明及常用用法
  6. mysql转openldap_用mysql作openldap的后台数据库
  7. android aes256加密算法,Android中AES256加密的实现
  8. 12.GitLab System Hooks
  9. networkComms 通信框架之 消息处理器
  10. 190615每日一句;每个学生都不能错过的9个人生忠告; 什么样心态的人,才能取得最终的成功
  11. 怎样让计算机默认记事本格式,电脑记事本怎么改格式
  12. 网易云听歌服务器异常,“网易云音乐WIFI下无法播放音乐”问题解决
  13. Word导出PDF图片模糊、失真 解决办法
  14. 《大前端进阶 Node.js》系列 必知必会必问(面试高频)
  15. 爬虫(二) parse、各类请求和伪装UA
  16. 枚举.........
  17. 大熊猫源致病大肠杆菌CCHTP全基因组测序及耐药和毒力基因分析
  18. 03-SQLPlus的常用命令和使用
  19. 田亮晒森碟与海豚亲吻照 父女开心超有爱
  20. 你想要的资源我都有(2)

热门文章

  1. MyBatis的学习之路(二)
  2. 注册Tomcat服务为系统服务
  3. JSON数组分配输出每个li
  4. BufferedWriterTest
  5. Crusher Django 学习笔记4 使用Model
  6. 安装perl5.10.0
  7. Quantaxis更新数据到最新
  8. 严蔚敏数据结构:链表实现一元多项式相加
  9. c语言贪吃蛇最简单代码_C语言指针,这可能是史上最干最全的讲解啦(附代码)!!!...
  10. Python 之 Python2 和 Python3 的区别