http://blog.chinaunix.net/uid-25513153-id-187780.html

三次握手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 10000 0
2 B->A 20000 10000+1=10001
3 A->B 10001 20000+1=20001
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0

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

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

数据传输阶段:
序号  方向      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也发一个数据包,告诉B,你的上个包我收到了。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号的正确理解相关推荐

  1. 趣谈TCP三次握手连接

    TCP三次握手链接 1.先趣谈三次握手链接 2.TCP三次握手:报文段交换 - TCP报文段结构 - 三次握手分析 3.问:为什么发送方要发出第三个确认报文呢? 1.先趣谈三次握手链接 在开始正式的讲 ...

  2. Tcp三次握手连接梳理

    之前一直对tcp的三次握手和四次挥手总是懵懵懂懂,感觉知道个大概,但是又说不清楚.所以查阅了一些网上的优秀文章,在这里尝试梳理一下加深自己理解和记忆. 一.TCP报文段结构 要了解三次握手的过程中发送 ...

  3. TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:

    1.TCP建立连接,三次握手 建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据. 客户端请求服务端建立连接 第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置 ...

  4. TCP三次握手建立连接的过程

    来源:TCP三次握手建立连接的过程 TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认.TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接. 下面详细讲解三次握手的过程 ...

  5. TCP三次握手建立连接

    一.三次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程.最开始的时候两端的TCP进程都处于ClOSED(关闭)状态. 这 ...

  6. TCP三次握手建立连接和四次挥手关闭连接

    TCP三次握手 是指建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据. 第一次握手:客户端发送第一个包,其中S ...

  7. 用wireshark抓包分析TCP协议的三次握手连接、四次握手断开

    用wireshark抓包分析TCP协议的三次握手连接.四次握手断开 一.TCP三次握手图解 二.TCP得四次挥手过程 三.用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 一.TCP三 ...

  8. TCP传输连接--建立连接阶段(TCP三次握手)

    目录 一.TCP相关概念: 二.TCP连接建立过程中要解决的问题: 三.TCP三次握手的过程: 四.可以两报文握手建立连接 五.总结: 一.TCP相关概念: 1.TCP是面向连接的协议. 2.TCP是 ...

  9. 43.TCP三次握手建立连接的过程

    TCP 是面向连接的协议,所以每次发出的请求都需要对方进行确认.TCP 客户端与 TCP 服务器在通信之前需要完成三次握手才能建立连接. 下面详细讲解三次握手的过程. 第 1 次握手 第 1 次握手建 ...

最新文章

  1. snmp在企业网中的应用
  2. iOS开发之autoLayout constraint
  3. 刚刚,官宣100000个炫酷微信红包封面,速度撸!
  4. 【数据结构基础笔记】【栈】
  5. 重磅!ICCV 2019 COCO + Mapillary 联合识别挑战赛开启!
  6. 关于正则表达式的学习
  7. java数据类型 枚举_枚举(enum)属于原始数据类型(primitive typ
  8. Android Studio更新后导入项目报错问题解决(Minimum supported Gradle version is ×.×.×. Current version is ×.×.× )
  9. 硬件电路设计笔记-电平转换电路
  10. java web开中WebRoot下的jsp和WebRoot文件夹下的jsp(html)引用css样式
  11. 近年来,小样本学习取得重大进展了吗?
  12. ubuntu桌面便签_在Deepin 20、Ubuntu 20.04中安装便签小工具Stickynotes
  13. 迈思德物联网网关问答集锦
  14. pep8 python 编码规范下载_PEP8 Python 编码规范整理
  15. 树莓派系统剪裁、克隆
  16. utf-8 python 乱码prinnt u_python处理一些乱码的中文文本时decode('utf-8')报错的处理
  17. 打开wifi,扫码二维码添加Wifi,需要把二维码放到最左边下方时才能快速的扫描到
  18. C++练习笔记STL模板库之常用算法1
  19. 绕开BAT, 长成MMP
  20. 中值联:首个区块链诚信认证平台成立

热门文章

  1. 【CentOS 7】 yum源安装mysql5.6
  2. idea没有RunDashboard解决办法
  3. 多功能雨伞项目计划书_雨伞项目投资计划书
  4. java 图片上传非jsp_java问题用java代码在后台如何将jsp页面上的图片上传(是 爱问知识人...
  5. window.location.href不打开新窗口_嘿,这条微博值得一看:不登录如何访问页面
  6. 软件开发生命周期中的设计阶段_测试基础——软件开发生命周期
  7. python requests发送websocket_Pywss - 用python实现WebSocket服务端
  8. python中什么可变_Python中的可变类型与不可变类型
  9. java高并发(十九)死锁、spring线程安全
  10. 测试小白入门必知必会的8个测试工具