概念

  • sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。(注意这里使用的是“应该”。因为对于没有数据的传输,如ACK,虽然它有一个seq,但是这次传输在整个data stream中是不占位置的。所以下一个实际有数据的传输,会依旧从上一次发送ACK的数据包的seq开始)
  • acknowledge number:表示的是期望的对方(接收方)的下一次sequence number是多少。
  • 注意,SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一,但是,ACK的传输,不会让下一次的传输packet加一。
  • TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收(当某个主机开启一个TCP会话时,他的初始序列号是随机的,可能是0和4,294,967,295之间的任意值,然而,像Wireshark这种工具,通常显示的都是相对序列号/确认号,而不是实际序列号/确认号,相对序列号/确认号是和TCP会话的初始序列号相关联的。这是很方便的,因为比起真实序列号/确认号,跟踪更小的相对序列号/确认号会相对容易一些)

使用初始化序列号的原因(ISN–Initial Sequence Number)

使用固定序号

带着这几个问题,我们通过这个例子来看一下在tcp连接建立时使用相同序号的情况,如下图所示:

 1. 假设现在A和B使用固定的序号,A使用序号1和B建立tcp连接,发送一个SYN报文,SEQ = 1,经过三次握手后A和B之间就建立tcp连接完成。

2. 当A和B建立完tcp连接后,然后A又使用相同的序号1向B发送了200字节数据,不过因为网络拥塞问题,这个tcp数据报一直在网络中逗留,并没有立即到达B。

3. 由于A发送的tcp数据报一直没到达B,正好此时A发生故障并重启,于是B就释放这条tcp连接了。

4. 然后A重启后又使用序号1和B建立新的tcp连接。

5. 当tcp连接建立完成后,A又使用序号1向B发送了240字节的数据,不过这次网络很稳定,B马上就收到A发送的这240字节的数据,注意:此时A发送数据是使用的新的tcp连接。

6. 然后A之前发送的tcp数据报(200字节)经过一段时间后,终于到达B。不过这个tcp数据报是属于之前已经释放的旧的tcp连接,按理来说,B应该把这个数据报丢弃掉才是。但是由于A每次发送报文都使用了相同的序号(SEQ = 1),这可能会让B误认为这200字节是属于新建立的tcp连接的,因此B会对这200字节数据照收不误。这就导致B在收到新tcp连接的数据后,又收到旧tcp连接的数据,从而出现数据乱序的问题。

初始化序列号的目的

由于A和B之间的一个tcp连接通常是由A和B的2个ip地址,2个端口号构成的四元组,因此当A出现了故障把这个tcp连接断开了,之后再以相同的四元组建立新的tcp连接(也就是说A和B两次建立tcp连接都是使用了相同的ip地址和端口),就会出现数据乱序的问题。

换句话说,只要A发送了一个tcp报文段,且这个tcp报文段的四元组和序号,和之前的tcp连接(四元组和序号)相同的话,就会被B确认。这其实反映了tcp的一些缺点,如果被一些恶意攻击者加以利用tcp的这种缺点:选择合适的序号,ip地址和端口的话,就能伪造出一个tcp报文段,从而打断正常的tcp连接。但是初始化序号的方式(通过算法来随机生成序号)就会使序号难以猜出,也就不容易利用这种缺点来进行一些恶意攻击行为。

通过上面所述我们知道,如果A和B之间发送数据每次都使用相同序号的话可能会引发一系列的问题,但是使用不同序号的话,那么B在接收到这个序号为1的tcp报文时,发现这个tcp报文的序号不在新tcp连接的接收范围内时会把这个tcp报文丢弃掉,也就避免了数据乱序的问题。

因此我们可以明白,客户端和服务端双方在建立tcp连接并初始化序列号,那么上面所说的这些情况从一开始就可以避免。另外,tcp在初始化序列号的过程也是比较复杂的,一般来说,这个序号的范围是0-2^{32} -1之间,而且序号的生成也是随机的,通常是一个很大的数值,也就是说每个tcp连接使用的序号也是不一样的。

三次握手

  1. 客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号(ISN:Inital Sequence Number)是客户端随机产生的一个值,确认号是0;
  2. 服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1;
  3. 客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。

消息收发


【接三次握手的序列号和确认号】

  1. 我们假设10.128.12.200是客户端,183.36.108.16是服务器;
  2. 客户端发送PSH,ACK,报文体的长度为228,此时seq为三次握手时服务器发给客户端的seq + 1;
  3. 服务器给回送ACK给客户端,seq 为发送PSH,ACK时的Ack的值,ack为发送PSH,ACK时的seq + 报文体长度
  4. 服务器给客户端发送PSH,ACK,seq= 三次握手时最后一次握手的ack值,ack=服务器想下一次收到的报文的序列号,报文长度为20
  5. 客户端发送给服务器PSH,ACK, seq = 第四步的ACK, ack = 第四步中的seq + 报文体长度, 报文体长度=228
  6. 服务器发送给客户端PSH,ACK,seq = 第五步中的ack, ack = 第五步的seq + 报文体长度, 报文体长度=20
  7. 客户端给服务器回送ACK, seq = 第6步的ack, ack = 第6步的seq + 报文体长度

四次挥手


【接消息收发的序列号和确认号】
图中的第二次挥手和第三次挥手是合并了

  1. A:10.128.12.200, B:183.36.108.16
  2. A -> B 发起断开连接,FIN包 seq = 最后一次发送ACK包的seq, ack = 最后发送ACK包的ack
  3. B -> A B收到A发起的断开连接后,发送ACK给A,此时seq = 41, ACK=457
  4. B收到A发起的断开连接后,业务处理完后,会向A发起断开连接发送FIN包给A, seq=41, ACK=458, FIN包虽然没数据,但是会占用一个字节
  5. A->B 收到FIN包或会发送ACK给B, 此时seq = 458, ack = 41

总结

time_wait的时间

MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为tcp报文(segment)是ip数据报(datagram)的数据部分,具体称谓请参见《数据在网络各层中的称呼》一文,而ip头中有一个TTL域,TTL是time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

TCP/IP各流程中的seq number与ack seq number相关推荐

  1. TCP/IP协议簇中ARP协议

    目录 1.ARP协议简介 2.ARP协议结构 3.wireshark抓包分析 4.ARP协议分类 5.ARP协议应用 6.ARP攻击 1.ARP协议简介 在<IP协议>中我们讲解了IP地址 ...

  2. java tcp ip通信_Java中Socket实现TCP/IP协议的通信

    TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的. Jav ...

  3. TCP/IP协议簇中的子网掩码有什么作用

    文章目录 前言 IP地址分类 子网掩码 掩码的作用 掩码表示 子网拆分 子网合并 网络包的传播 总结 前言 前几天在配置数据库主从结构时查询了一些IP配置,后来编写远程执行脚本时又配置了一些IP数据, ...

  4. 网络安全——TCP/IP协议簇中的安全协议

    网络安全--安全协议 为TCP/IP每一层(网络接口层以上)设计了特有的安全协议 序号 安全协议 对应TCP/IP的层 功能 1 DNSSec.PGP,SET等 应用层 实现两个应用进程之间消息的安全 ...

  5. 请求发起过程,在tcp/ip四层网络模型中所做的事情

    当应用程序用T C P传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络.其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息) 客户端如何找到目标服务 在客户 ...

  6. Java 基于 TCP/IP 实现 Socket中的多客户端通信

    使用多线程实现多客户端的通信功能, Client.java(客户端)同上一节中的一致,不需要修改 Server.java package com.learn;import java.io.IOExce ...

  7. Network 之五 TCP/IP 协议族、工作流程、常用协议格式

      最近工作需要搞网络相关的内容,由于之前对网络了解比较少,因此开始重点学习一下网络相关的各种知识.博文中的有些内容来自于在学习过程中对于一些互联网上我认为的重点知识的记录,如果侵权请联系删除!    ...

  8. gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_关于TCP/IP,必知必会的十个问题!...

    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. TCP/IP十个问题 TCP/IP十个问题 一.TCP/IP模型 TCP/IP协议模型(Trans ...

  9. ip设置 kali 重置_在 Windows 系统中如何重置 TCP/IP 协议堆栈修复网络连接问题

    Internet 在 TCP/IP 协议上工作,如果 TCP/IP 协议堆栈在 Windows 或任何其他操作系统(例如 Linux 或 MacOS)中无法正常工作,则您的 Internet 连接会出 ...

最新文章

  1. Linux期末复习题库(1)
  2. 网上商城—管理员修改商品
  3. springiocxml方式注入对象原理分析
  4. 【渝粤题库】国家开放大学2021春3924★汽车电器设备构造与检修题目
  5. python测开面试题_python十道经典面试题,测试你的python功底!
  6. Hibernate的双向1-1关联(七)
  7. 数学建模论文写作方法
  8. Proteus8.6版本+ STM32F103驱动LCD12864显示程序+按键+ADC
  9. 强制停用华为桌面,换第三方桌面
  10. 当刷机工具遇到SetupConnection时的解决方法
  11. 微信小程序:聊天斗图微信表情包
  12. 新一代物联网商用全面铺开 NB-IoT擎起新智慧城市
  13. 一个IT实习生的感悟
  14. 关于调制比、过调制、基波电压和母线电压的概念和关系总结
  15. 苹果App卡审原因猜测分析
  16. Java网络爬虫基础概述
  17. android2048项目报告,Android项目开发实战-2048游戏
  18. GreenPlum 大数据平台--运维(三)
  19. BT下载的原理 和疑问
  20. 第二篇 基础篇—燃烧吧!我的雌雄双股剑! 第5回 二弟呀,面子工程很重要

热门文章

  1. JMeter接口测试文档
  2. 【python轻量级中台框架开发第一层】 ORM flask-sqlacodegen
  3. 面试中软件开发测试题--Java自学网
  4. 北邮计算机学院实验室介绍,实验教学中心整体概况
  5. Linux服务器离线安装transformers
  6. 验证码的前世今生(前世篇)
  7. 中望cad2017专业版|中望cad2017sp专业版下载
  8. 注册Keil软件时出现TOOLS.INI_TOOLCHAIN NOT INSTALLED的解决办法
  9. Source Insight 4.0 注册
  10. html 窗口左边悬浮ul,js + css实现左侧悬浮导航栏