三次握手Three-way Handshake

一个虚拟连接的建立是通过三次握手来实现的

1. (B) –> [SYN] –> (A)

假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.

注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。

2. (B) <– [SYN/ACK] <–(A)

接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.

注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (B) –> [ACK] –> (A)

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成

Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位

握手阶段:
序号    方向         seq           ack
1    A->B         0               0
2         B->A         0               0+1=1
3         A->B         1               0+1=1
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为0,此时ACK标记为0,也就是如果抓包的话是看不到ack标记的。

2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为0,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即0+1=1

3:A收到B的回复后,它的seq是它的上个请求的seq加1,即0+1=1,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即0+1=1

数据传输阶段:
序号         方向        seq             ack                                     size
23                 A->B                40000         70000                                 1514
24                 B->A                70000         40000+1514-54=41460     54
25                 A->B                41460         70000+54-54=70000         1514
26                 B->A                70000         41460+1514-54=42920     54
解释:
23:B接收到A发来的seq=40000,ack=70000,size=1514的数据包。
24:于是B向A也发一个数据包,告诉A,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。
25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包(应用层纯数据)的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。

其实,在握手和结束时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度。如果从以太网包返回来计算所加的长度,就嫌走弯路了。
另外,如果对方没有数据过来,则自己的确认号不变,序列号为上次的序列号加上本次应用层数据发送长度。

TCP的SEQ和ACK总结:

在TCP通讯中,无论是建立连接,数据传输,友好断开,强制断开,都离不开Seq值和Ack值,它们是TCP传输的可靠保证。Seq是发送方告诉接收方,我当前从第Seq个字节开始发送len个字节数据(不包括以太网Eth头,IP头和Tcp头,也就是纯数据长度)给你,而Ack则是接收方给发送方回复:接收方回复的Ack=发送方Seq+发送数据长度len。
      在建立连接双方握手时,发送方的Seq为0,表示发送的数据长度也为0,这时接收方收到数据帧后,会判断Seq+数据长度为0或者Seq+数据长度为1的话,那么在回应发送方的Ack的值就为1(也就表示确认号有效,为0的话就表示数据包中不包含确认信息(即不含有Ack字段),忽略确认号字段)。
      在数据传输中,如果Seq+数据长度不为0或1并且数据长度不为0的话,则回应时的Ack就等于Seq+数据长度的值,这就表示我已经收到Seq+数据长度个字节的数据。发送方收到该Ack就会比较自己的Seq+刚发出去的纯数据长度,如果一致,则回应接收方的Ack,并且发送下一个包,否则将重发该包,若超时还没收到Ack也会重发该包。
————————————————
版权声明:本文为CSDN博主「ByteBai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bytebai/article/details/21752925

TCP:SEQ号与ACK号相关推荐

  1. TCP三次握手连接及seq和ack号的正确理解

    http://blog.chinaunix.net/uid-25513153-id-187780.html 三次握手Three-way Handshake 一个虚拟连接的建立是通过三次握手来实现的 1 ...

  2. TCP协议中的Ack和Seq号

    TCP协议中的Ack和Seq号 一.基本概念 seq:表示本次发送数据的偏移量,也就是从哪里开始发送数据. len:表示本次tcp携带的数据长度. ack:首先意味着已经收到对方多少字节数据,其次告诉 ...

  3. TCP头部分析与确认号的理解

    TCP头部分析与确认号的理解 https://www.cnblogs.com/xcywt/p/8075623.html TCP协议(1)--TCP首部 https://blog.csdn.net/la ...

  4. TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体,

    TCP/IP,TCPsocket,tcp协议的特点,tcp报文段最长字节数,tcp头内容,确认号和超时时限的设定细节,tcp协议是GBN和SR的混合体, 一.TCPsocket 1.TCP是面向连接的 ...

  5. pcb可以给用户进程读吗_「TCP/UDP」一个端口号可以同时被两个进程绑定吗? - 一口Linux...

    一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...

  6. TCP协议之《ACK报文限速》

    PROC文件tcp_challenge_ack_limit控制每秒钟发送挑战ACK报文的数量.避免遭受Blind In-Window Attacks,包括reset,sync或者数据注入攻击等,详解R ...

  7. TCP数据接收之ACK的处理

    在TCP输入数据段的处理过程中,如果发现输入段携带了ACK信息,则会调用tcp_ack()进行ACK相关的处理.实际中,ACK信息总是会携带的,因为携带ACK不需要任何的附加开销,所以对于输入的每一个 ...

  8. TCP连接中的ACK与ack

    在TCP协议三报文握手建立连接的过程中,TCP请求报文段中存在ACK和ack两个数值.要搞清楚这两个数值的含义,得了解TCP报文段的首部格式: 1.TCP报文段的首部格式: TCP报文段分为首部与数据 ...

  9. Windows如何查看端口号以及进程号

    Windows下如何查看端口号还有进程号 Win+R 打开命令控制台 在里面输入Netstat –aon |find "port" 或 Netstat –aon |findstr& ...

最新文章

  1. linux diff 补丁文件夹,LINUX下制作补丁文件 diff,patch
  2. 阿里云分布式缓存OCS与DB之间的数据一致性
  3. [Linux] 进程间通信
  4. mongodb 导出一条数据导出_使用MongoDB命令工具导出、导入数据
  5. 快速序列化组件MessagePack介绍
  6. 交流伺服系统设计指南_交流设计
  7. 黄金分割小数点后100位小数的c语言编程,黄金分割数小数点后100位
  8. Linux 命令(49)—— export 命令(builtin)
  9. Java中文乱码问题如何解决?
  10. 如何使用虚拟专用网络登录网络设备?
  11. 用户体验分析: 以 “通大就业微信公众号” 为例
  12. Kafka单节点安装部署
  13. Modbus家族之 ASCII
  14. 连接器E-mark认证要准备什么资料?
  15. 阿里实习 90 天:从实习生的视角谈谈个人成长
  16. mysql易百_MySQL Replace语句
  17. ffmpeg转码时对变帧率和固定帧率的处理
  18. MapReduce框架
  19. Kubernetes暴力删除(rm -rf)与无影响恢复
  20. solr的多条件组合查询

热门文章

  1. php--理解PHP的依赖注入和laravel的服务容器
  2. LeetCode-35. Search Insert Position
  3. Shell第三篇:基本语法
  4. 剑指offer--面试题12
  5. Big Data, Hadoop and StreamInsight™
  6. mssql自定义函数中使用游标
  7. 批量(导入导出)迁移AD中的用户信息和密码到新环境中,同时保持用户在MOSS中的权限【addusers,ldifde,copypwd,UserInfo,tp_SystemID】...
  8. js 浅拷贝直接赋值_第二十二篇 JS中浅拷贝的方法有哪些?
  9. 1.6 课程资源-深度学习-Stanford吴恩达教授
  10. C# 指针的使用 ref byte 转 byte 或 byte [] ref 与指针