【网络协议笔记一】TCP连接管理

处理差错的两种主要方法是差错校正码和数据重传。
差错校验码:基本上是添加一些冗余的比特,使得即使某些比特被毁,正确的信息也可以被简单的恢复。

流量控制:
流量控制分为基于速率的和基于窗口的。
基于速率的流量控制是发送方指定某个发送数据的速率,则数据不能超过这个速率发送,多用于多播和组播。
基于窗口的流量控制是发送方和接收方都维护一个滑动窗口(大小可变),接收方可以通知发送方使用多大的窗口,简称窗口通告或窗口更新。多用于TCP协议,窗口通告是和ACK于同一个分组。
TCP使用的ACK是积累的,一个ack等于N的ACK表示对端成功收到所有直到序号N(但不包含N)的字节。鲁棒性:如果中间一个ACK丢失,但是后面到达的ACK就可以帮忙确认前面的数据了,而不会导致数据的重传。
TCP不会为每一个报文都设置一个不同的重传计时器。而是发送一个窗口的数据,它只设置一个计时器,当收到ACK时才更新超时时间。如果有一个确认以及后面已发送序号的确认没有及时收到,则会重传这些已发送的报文段。

拥塞控制:
流量控制处理发送方和接收方收发数据的关系, 拥塞控制则是通过调节发送方的发送速率来处理两方之间的网络(路由器)。
TCP接收端可能对一个已确认过的报文段再次确认,以帮助发送方计算它的拥塞控制。

TCP中的可靠性:
TCP的序列号代表了每一个分组的第一个字节在整个数据流中的字节偏移,应用层发送的数据可以在TCP中被拆成不同的数据报发送到对端,并在对端的TCP层中得以按字节的顺序重组。
为了保证交给应用层的数据顺序正确,TCP接收端可能会使序号靠后的数据先不交给应用层,直到前面有缺失的序列号的报文段被补齐。
SYN和FIN会消耗一个序列号,而ACK不消耗序列号。
TCP可以被描述为“一种带积累正向确认的滑动窗口协议”。ACK号字段为构建为用于指明在接收方已经顺序收到的最大字节加1。即中间有报文还没有收到,尽管收到了之后的报文,也不能回应ACK确认。但是现代TCP有SACK选择确认的选项,可以允许接收方告诉对端自己正确接收到的次序杂乱的数据。

TCP的半关闭操作是指关闭数据流的一个传输方向,两个半关闭操作才能够关闭整个连接。TCP协议规定通信的一方在完成所有数据发送后,能向对方发送一FIN。当对方收到这个FIN分节时,就会告知应用程序对方已经终止了对应方向的数据传输。

一个同时打开三次握手连接的过程需要交换4个报文段,比普通的三次握手增加了一个。

初始序列号:
序列号可能导致的问题:在一个连接中,TCP报文段在经过网络路由后可能会存在延迟抵达和排序混乱的情况:如果连接因为某个报文段的长时间延迟而被关闭,然后又重新打开相同4元组的连接,之前延迟的报文段又会被误以为是有效数据重新进入新的连接中,导致序列号重叠。因为一个TCP报文段被对方认为是正确的条件是:同时具备连接的4元组合当前活动窗口的序列号。另一种问题是可能会收到攻击,任何人只要选择合适的序列号和套接字,都可以伪造出一个TCP报文段,从而打断正常的TCP连接。
所以为了解决这个问题,需要仔细选择初始序列号。
TCP解决方式:在发送SYN分节建立连接之前,通信双方都会各自选择一个初始序列号,初始序列号随着时间而变化(32位的计数器,每4微秒加1),因此每个连接都有不同的初始序列号,防止与其他连接的序列号重叠。还可以在应用层利用CRC或校验和的方式保证数据接收的正确性。
具体方法:现代系统通常采用半随机的方法选择初始序列号。linux系统采用一个基于时钟的方案,通过散列函数来为每一连接的时钟设置随机偏移量,使得生成的序列难以被猜出,且随时间变化,32位的初始序列号中,高8位是保密的序列号,其余各位由散列函数生成。

连接建立超时:
在linux系统中,系统变量net.ipv4.tcp_syn_retries表示在一次主动打开申请中尝试重新发送SYN报文段的最大次数;系统变量net.ipv4.tcp_syack_retries表示在重新发送SYN+ACK报文段的最大次数。它们的默认值都是5次。每一次重发的延迟时间都是上一次时间的两倍,称为指数回退。

PSH(推送位)被置1,则表示该报文段正在发送所有来自己缓冲区的数据。

TCP选项:
每个选项的头一个字节表示为“种类”,大多选项都会根据自己的种类来确定自身的字节数len,选项的总长度包括了种类与len个字节。
由于TCP的头部的长度应该是32位bit的整数倍,所以NOP是用于给数据发送者填充空间用的,为了对齐。EOL表示为选项的结尾。
常见的TCP选项如:
1、最大段大小选项MSS:TCP协议允许的从对方接收到的最大报文段(只包括TCP数据部分,而不包括头部),也是通信双方在发送数据时能够使用的最大报文段。默认是536字节,在通信开始时SYN报文通告对方,表明自己在整个连接中不愿意收到比这个更大的TCP数据段。典型值是1460字节,因为MSS1460+TCP头部20+IP头部20=1500字节,是以太网的最大传输单元MTU和互联网路径最大传输单元的典型值。
2、选择确认选项SACK:当接收到乱序的数据时,它能够告诉对端已经成功接收到的数据块的序列号范围,从而帮助对端有效的重传。每一个范围被称作一个SACK块,一个选项最多可以包含3个SACK块。该选项的开启是在通信双方开始时的SYN报文段发送的,但是只要已经发送了该选项,SACK块就能通过任何报文段发送出去。
3、窗口缩放选项WSOPT:能够有效地将TCP窗口广告字段的范围从16位扩展到30位,用于在大宽带、高延迟网络上提供海量数据传输服务时。该选项需要在通信双方的SYN报文段包含,由通信双方根据接收缓存的大小自动选取。
4、时间戳选项TSOPT:发送方添加两个4字节的时间戳数值,第一个部分在发送者赋值填充;第二个是【时间戳回显重试字段】由接收方收到时原封不动地填充,这样回发给发送方的时候,发送方就知道自己之前发送的时间戳,以此来估计RTT(即发送方报文的TSV和接收方回应ACK的TSER值一样)。时间戳的作用是:(1)估算重传时间,为了设置重传超时;(2)防回绕序列号(【旧的报文段重新出现并包含当前正在传输的序列号】的问题只会出现在相对高速的连接中,通过时间戳可以区分新旧报文段)。
5、用户超时选项UTO:指明发送者在确认对方未能成功接收数据之前愿意等待该数据ACK的时间。

TCP路径最大传输单元发现过程:
一个连接的两个方向的路径最大传输单元是不同的。当中间路由器的最大传输单元小于任何一个通信端的最大段大小时,TCP就会执行【路径最大传输单元发现过程】,即尝试发现适合的MSS。

TIME_WAIT状态:
客户端通常执行主动关闭操作,主动请求关闭连接的一方,在发送最后一个ACK后,会进入TIME_WAIT状态,又称2MSL(最大段生存期的两倍)等待状态。因为被动关闭连接的一方经常会重传FIN报文,直到收到一个最终的ACK。为了避免发给对端的ACK丢失,主动关闭连接的一端需要在发送完ACK后等待2MSL时间。处于TIME_WAIT状态的端口号不能被重复使用,因此终止一个客户端后立刻重启同一个客户端,新的客户端应该选用和上一个客户端不同的端口号。但如果我们将一个已有TCP连接的服务端终止并马上重启,服务端会收到一个“绑定失败的错误”,这是因为服务端程序通常使用固定的端口号,这是前一个连接的处于2MSL等待状态造成的。通过套接字选项SO_REUSEADDR可以重复绑定同一个端口号。2MSL状态能防止新的连接误将前一个连接的延迟报文段接收。

FIN_WAIT2状态:
主动发送关闭请求的一方在收到第一个ACK后,会进入FIN_WAIT2状态,除非出现半关闭的情况,不然此时TCP连接的对端会识别接收到EOF(文件末尾通知),并发送FIN。
为了不永远处于等待对端FIN的FIN_WAIT2状态,TCP的做法是:如果主动关闭的一端执行的是一个完全关闭的操作,而不是半关闭来指明它还期望收到数据,那么就会设置一个计时器,如果当计时器超时的时候连接是空闲的,则TCP就会转移到CLOSED状态。linux系统下默认值是60s。

重置报文段(RST字段):
产生RST的三个情况:
1、不存在端口的连接请求:当一个连接请求到达对端,但是对端的目的端口没有正在监听的TCP进程,此时对端就会发送一个RST回来。而UDP协议是,当一个数据报到到一个不能使用的目的端口时,会生成一个ICMP目的地不可达的消息,TCP协议则是使用了重置报文段来代替完成相关工作。
2、TCP想取消一个已有的连接:发送FIN关闭连接是属于有序释放,但是可以通过发送RST来关闭连接,属于终止释放。终止释放可以为应用进程提供两大特性:(1)任何排队的数据都将被抛弃,一个重置报文段会被立刻发送出去;(2)重置报文段的接收方会说明通信另一端采用了终止的方式,而不是一次正常关闭。重置报文段不会令通信的另一端做出任何响应——它不会被确认,接收重置报文段的一端会终止连接并通知应用程序当前连接已重置,收到RST会导致read函数在读取socket描述符时返回-1。
3、半开连接中,重置报文作为对上一次连接的数据的响应:一个常见的例子是:服务器主机被切断连接后重启,留给客户端一个半开连接。当再次从这条
连接上收到数据时,服务端已经忘记了之前的连接,会给该数据的连接回应一个RST,然后连接被关闭。

TCP端口号:
1、linux查看端口号netstat -a -n -t。
-a选项报告所有的网络节点,包括处于侦听状态和未处于侦听状态的节点。-n选项以点分十进制(或十六进制)的数的形式打印IP地址,而不会用DNS将地址转化为域名。此外,该选项还会打印数值型端口号(例如22),而不是服务名(例如ssh)。-t选项用于只选择TCP节点。
Send-Q的意思是发送了尚未收到确认的数据字节数。
外部地址为::😗,表示一个通配符地址与端口号,即一个通配符节点。
2、处于LISTEN状态的本地节点会独自运行,当有新的连接请求到来并被接收时,操作系统中的TCP模块创建处于ESTABLISHED状态的新节点。处于ESTABLISHED状态的节点不能接收SYN报文段,而处于LISTEN状态的节点则不能接收数据段。
3、TCP限制本地IP地址:TCP服务器可以绑定一个特殊的地址,如果一个目的地址不是该绑定地址的主机连接服务器,则会回发一个RST报文段。而且服务器的应用程序不会察觉到该连接请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值