一、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。
二、连接超时
        当一个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),客户端放弃连接。

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

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

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/lshs/p/6038477.html

TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接相关推荐

  1. 【HTTP】连接管理--TCP

    几乎所有的HTTP通信都是由TCP/IP承载的,TCP/IP是一种常用的分组交换网络分层协议集. TCP连接 TCP连接是因特网上的可靠连接 TCP为HTTP提供了一条可靠(是因为 确认延迟)的比特传 ...

  2. ssms 连接 ssis_SSIS连接管理器:OLE DB,ODBC,ADO.NET

    ssms 连接 ssis In this article, I will first give an overview of the OLE DB, ODBC, and ADO.NET SSIS co ...

  3. 技术文档 | 5G系统连接管理:CM空闲和CM已连接

    当移动设备想要与5G核心网络进行通信时,因为它是第一次打开或由于处于空闲状态一段时间,并且网络删除了资源以暂时传输数据,因此它需要与访问管理功能建立连接( AMF).这称为连接管理. 连接管理(CM) ...

  4. 电脑显示无法加载远程访问连接管理服务器,win10系统宽带连接提示无法加载远程访问连接管理器服务错误711的解决办法...

    win10系统使用久了,好多网友反馈说win10系统宽带连接提示无法加载远程访问连接管理器服务错误711的问题,非常不方便.有什么办法可以永久解决win10系统宽带连接提示无法加载远程访问连接管理器服 ...

  5. 连接已失效_电信运营商物联网连接管理平台的研究及对比分析

    一.概述 从物联网概念首次提出发展至今,网络基础设施日益完善,关键技术频频突破,行业融合不断深入,垂直应用爆发增长,商业模式持续创新,人工智能.虚拟增强现实,区块链,边缘计算等技术为物联网进一步发展注 ...

  6. 【5G核心网】 5G System Connection Management 5GS连接管理

    当移动设备想要与 5G 核心网络进行通信时,因是第一次开启或由于处于空闲状态一段时间,并且网络已删除资源以暂时传输数据,因此它需要与接入管理功能建立连接(AMF).这称为连接管理.     连接管理( ...

  7. 5.3.2 TCP连接管理

    5.3.2 TCP连接管理

  8. 计算机网络-TCP运输连接管理

    目录 1 运输连接概述 2 TCP的连接建立 3 TCP的连接释放 1 运输连接概述 TCP 是面向连接的协议 TCP 连接有三个阶段:连接建立,数据传送,连接释放 TCP 连接的管理就是使 TCP ...

  9. 【计算机网络】传输层 : TCP 连接管理 ( TCP 连接建立 | 三次握手 | TCP 连接释放 | 四次挥手 )

    文章目录 一.TCP 连接管理 二.TCP 连接建立 三.TCP 连接建立 相关报文段 字段 四.SYN 洪泛攻击 五.TCP 连接释放 一.TCP 连接管理 TCP 传输数据过程 : 建立连接 -& ...

最新文章

  1. SAP MM 工序委外场景再探 – 相关采购申请单据中的总账科目确定
  2. java 根据当前时间获得一周日期
  3. SAP web service开发工具SOAMANAGER里ping按钮的实现细节
  4. 华强北AirPods洛达1562A固件升级教程,带空间音频(艾创力+东莞豪锐)
  5. java 计算器api_用JAVA编写一个简单的计算器~要使用接口的~急啊~
  6. python画3d图-使用python绘制3d的图形
  7. python 从列表中随机选择_使用条件Python从列表中随机选择
  8. 软件开发知识体系(一)
  9. 【计量经济学导论】16. 面板数据模型
  10. SequelizeAccessDeniedError的原因和解决方式
  11. 资产配置方案(基金)
  12. 大唐凌烟阁开国廿四将
  13. 苹果mac装双系统对电脑有影响吗?Mac电脑装双系统的利与弊
  14. 为promise增加abort功能
  15. Bing搜索崩了“无法访问”解决方案
  16. 华硕的主板装的服务器系统改win7,华硕主板win10改win7系统怎么操作
  17. 54. Java序列化三连问,是什么?为什么需要?如何实现?
  18. cacti安装/配置
  19. mt6355功率设计注意事项 [仅为mt 6758资料汇总]
  20. 战区与游戏服务器的连线已中断,使命召唤战区无法连接服务器如何解决?无法连接服务器解决方法介绍[多图]...

热门文章

  1. Android常见的内存泄漏分析
  2. python unittest教程_Python Unittest原理及基本使用方法
  3. Android 用MediaCodec ,MediaExtractor解码播放MP4文件
  4. KubeEdge led部署
  5. 如果使用 sftp 命令
  6. java比较吊的程序代码_java中 compareTo()的程序代码及用法
  7. 【Flink】Flink 报错 Initial AbstractPagedOutputView Segment may not be null
  8. Maven : maven异常记录-must be unique maven duplicate declaration of version
  9. 95-160-024-源码-DataStream-ConnectedStreams与union合并流
  10. 【Kafka】Kafka topic 的消费组 出现 CURRENT_OFFSET 为 unknown