问题现象:

一、TCP连接的ISN
        之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因
  • 防止同一个连接的不同实例(different instantiations/incarnations of the same connection)的数据包混淆。
同一个连接的不同实例是怎么回事呢?之前我们说过(源IP、源端口号、目的地址、目的端口号)这个四元组唯一标识一个TCP连接,当一个TCP连接在经历四次挥手关闭时,假如有一个数据包延迟特别大,而这个连接在关闭后又马上以相同的四元组建立起来,那么先前这个连接的TCP数据包到达的时候,如果系列号还落在接收窗内,那么这个数据包就可能会被错误接收。因此RFC0793指出ISN应该每4μs自增1,从而防止同一个连接的不同实例的数据包混淆。另外对数据完整性要求比较高的应该同时在应用层添加校验。
  • 防止TCP系列号欺骗
TCP系列号欺骗如下图所示,假设A是服务器,B是拥有特殊权限的客户端,C是攻击者,第一条消息C冒充B来向服务器A请求建立连接,此时C发出的数据包的IP地址会填写成B的;第二条消息假设A没有其他手段来验证B,而仅仅根据IP地址判断C发过来的建立连接的请求是B发过来的,因此向B发送SYN+ACK,此时假设B被C进行了DOS攻击或者处于其他异常状态而不能响应第二条消息(如果B处于正常状态会响应一个RST包来重启TCP连接,后面我们讲解RST数据包);第三条消息假如C能正确的猜测出A在第二条消息中的ISN,就可以冒充B和A完成三次握手的过程,让A误以为和B建立了连接。接下来C就可以冒充B给A发送一些危险数据或者指令而实现攻击。

因此假如ISN仅仅是依靠时间来增长还不够安全,因此RFC1948又提出了一个ISN随机生成的算法

ISN = M + F(localhost, localport, remotehost, remoteport)

其中M是一个计时器,这个计时器每隔4毫秒加1。F是一个Hash算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。要保证hash算法不能被外部轻易推算得出,用MD5算法是一个比较好的选择。
具体到linux的实现中,F采用MD5进行Hash,另外还会在F这个函数中带入一个随机的net_secret安全码进一步安全性,linux中M计时器则是每64ns加1。
2)原因分析
二、连接超时
        当一个TCP连接请求超时的时候,比如对应目标IP的主机挂掉的时候,会触发SYN数据包的重传,重传的时间间隔按照指数退避(exponential backoff)算法增长,还记得我们之前说过得SYN和FIN数据包是在逻辑上占有一个byte的是,也就会消耗一个系列号,消耗系列号意味着能进行重传,没有数据的ACK确认包因为不消耗系列号即使传输过程中出错也不会触发ACK数据包的重传。后续TCP重传部分我们会进一步介绍TCP的重传和指数退避。

在linux中net.ipv4.tcp_syn_retries变量表示TCP主动连接端SYN数据包的最大重传次数,net.ipv4.tcp_synack_retries表示TCP连接的被动端响应的SYN+ACK包的最大重传次数。也可以通过TCP_SYNCNT的socket选项单独设置某一个TCP连接SYN重传次数。

我们观察一下下图中SYN重传的过程,首先发出No 1的SYN包,在1s内没有收到SYN-ACK包,触发SYN重传即No 2包,后续又分别以2s/4s/8s/16s/32s的间隔进行SYN的重传,直到No 7包进行第6次重传依旧没有收到SYN-ACK回复(net.ipv4.tcp_syn_retries默认配置值为6),客户端放弃连接。

3)结论
三、长连接与短连接
TCP连接类型又可以分为长连接和短连接
  • 短连接:Client方与Server每进行一次报文收发时才进行通讯连接,收发完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.优点是管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段
  • 长连接:Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,可以用下面命令查看连接是否建立:netstat –f inet|grep 端口号(如5678)。此种方式常用于点对点通讯。

补充说明
1、linux中计算ISN的过程可以参考相关代码tcp_v4_init_sequence

TCP连接的ISN、连接建立超时及TCP的长短连接的更多相关文章

  1. TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接

    一.TCP连接的ISN         之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...

  2. TCP/IP详解学习笔记(10)-TCP连接的建立与中止

    TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...

  3. 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?

    看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章 ...

  4. TCP报文结构和长短连接

    参考博文: https://www.cnblogs.com/onlysun/p/4520553.html https://blog.csdn.net/zxy987872674/article/deta ...

  5. TCP建立连接的三次握手和TCP连接断开的四次挥手

    1. TCP建立连接的3次握手 2. TCP断开连接的四次挥手 [注意]中断连接端可以是Client端,也可以是Server端. 图3—Client端主动发起关闭连接请求 1. 假设Client端主动 ...

  6. 为何GET只发一次TCP连接,POST发两次TCP连接

    GET和POST是HTTP请求的两种基本方法,要说他们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  7. TCP/IP协议栈与数据包封装+TCP与UDP区别

    ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用.如图2-1所示,是TCP/IP参考模型和OSI参考模型的对比示意图. T ...

  8. 【Java TCP/IP Socket】深入剖析socket——TCP套接字的生命周期

    建立TCP连接      新的Socket实例创建后,就立即能用于发送和接收数据.也就是说,当Socket实例返回时,它已经连接到了一个远程终端,并通过协议的底层实现完成了TCP消息或握手信息的交换. ...

  9. tcp为什么要三次握手,tcp为什么可靠

    转自 : https://www.cnblogs.com/LUO77/p/5771237.html大体看过,没有深入研究,有需要时继续看. 为什么不能两次握手:(防止已失效的连接请求又传送到服务器端, ...

随机推荐

  1. eclipse中jad反编译工具的安装

    我的云盘:工具里面有 Q:为什么有必要在开发环境中配置反编译工具呢? A:  当运行引用了第三方jar包项目时,突然报出了jar包中的某个类的某一行出现异常.我们想看一下这个class文件的代码时,经 ...

  2. 数据结构_yjjsj(伊姐姐数字游戏)

    问题描述 伊姐姐热衷于各类数字游戏, 24 点. 2048.数独等轻轻松松毫无压力.一日,可爱的小姐姐邀请伊姐姐一起玩一种简单的数字 game,游戏规则如下:一开始桌上放着 n 张数字卡片,从左到右按 ...

  3. (数组)Largest Rectangle in Histogram(栈解问题)

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  4. Linux Wifi模块灰色解决办法

    https://www.cnblogs.com/mcy0808/p/5415689.html -sudo gedit /etc/rc.local 连上了CUG但还是打不开网页,是不是需要编辑Conne ...

  5. 使用canvas压缩图片 并上传

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. appium报错信息:Could not extract PIDs from ps output. PIDS: [], Procs: ["bad pid 'uiautomator'"]”

    appium+Java 自动化测试真机测试时报错“info: [debug] Error: Could not extract PIDs from ps output. PIDS: [], Procs ...

  7. 手机APP测试

    注:以下内容来自网络: 一.手机APP测试类型 1.1 接口协议测试 在APP客户端开发设计时,一般服务端会提供相应的接口协议文档,接口协议文档的质量,决定了APP的开发进度.此部分的测试,应首先检测 ...

  8. echarts图标legend全选功能添加

    平时做图表的时候经常用echarts,确实是一款很好用的插件. 开发中遇到了一个问题,在展示的曲线,也就是legend很多的时候,不太好只展示其中几条.配置中是可以默认设置初始化是否展示,但不适用于全 ...

  9. StackOverflow

    stackoverflow栈溢出 stacker栈式存储器 signup注册  signin登陆 inbox收信信箱 verify 核实 otherwise另外的 noted说明  (就是说有明文指出 ...

  10. linux中脚本权限问题以及win下使用telnet测试linux端口

    一个脚本叫up,执行脚本报错如下: -bash: ./up: Permission denied 解决: chmod +rx up 在执行,OK了. /************************ ...