我们知道,传输层是OSI模型中用户进行数据传输的分层,目前仅有TCP和UDP两种协议可用。TCP为了进行传输控制,引入了三次握手机制,以确保通信连接的建立。道理很简单,我们跟别人打电话聊天时,对方拿起电话接听后第一句话肯定是“喂”,而我们听到这句话,就能确定电话接通了。同样的道理,TCP建立连接时客户端先发起一个SYN包作为确认连接的请求,服务端收到后回复一个肯定的确认应答(ACK)来实现可靠的数据传输。如果客户端过一段时间仍未收到确认应答,就可断定连接失败,再次发起重连。下面看下这三次握手的过程:

  第一次握手:客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;在建立连接的同时,也可以确定发送数据包的长度单位,即“最大消息长度”(MSS:Maximum Segment Size);这时侯的客户端、服务端都不知道连接是否能否建立成功;

  第二次握手:服务器收到SYN包,必须确认客户的SYN请求(ack=x+1),同时自己也发送一个SYN包(seq=y),合起来即SYN+ACK包,此时服务器进入SYN_RECV状态;返回服务器的最大消息长度MSS,后续所有客户端请求数据将按服务器的MSS进行传输;当客户端收到服务端的消息后,它心里清楚自己到服务端(第一次握手)、服务端到自己(第二次握手)的两条连接都是OK的;但服务端只知道客户端 -> 服务端这一条连接是OK的,但自己往客户端的连接是否能建立,它自己心里是没底的,所以需要做进一步确认,给客户端发消息;

  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送到达服务端后,服务端已经明白服务端 -> 客户端也是OK的了,客户端和服务器进入ESTABLISHED状态,完成三次握手。

  我本机ip地址是10.73.158.209,再看我们要访问博客园的ip地址:

C:\Users\wulf>ping www.cnblogs.com

正在 Ping www.cnblogs.com [42.121.252.58] 具有  字节的数据:
来自 42.121.252.58 的回复: 字节= 时间=11ms TTL=
来自 42.121.252.58 的回复: 字节= 时间=11ms TTL=
来自 42.121.252.58 的回复: 字节= 时间=11ms TTL=
来自 42.121.252.58 的回复: 字节= 时间=11ms TTL= 42.121.252.58 的 Ping 统计信息:
数据包: 已发送 = ,已接收 = ,丢失 = (% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 11ms,最长 = 11ms,平均 = 11ms

  接着我们按host 42.121.252.58这个规则过滤出访问博客园的抓包:

  第一次握手:10.73.158.209 Seq=0 -> 42.121.252.58

  从标志位看出,同步位有值,在做请求(SYN):Syn 同步位为1;最大消息长度客户端发了1460字节试探一下。

  第二次握手:42.121.252.58 Seq=0 Ack=1 -> 10.73.158.209

  从标志位看出,确认位、同步位有值,在做应答(SYN+ACK):Syn 同步位为 1 、Acknowledgment 确认位为 1;服务端告诉客户端,我的最大消息长度只能支持1444字节,你就按这个来传输数据吧。

  第三次握手:10.73.158.209 Seq=1 Ack=1 -> 42.121.252.58

  从标志位看出,只有确认位有值,在做再次确认(SYN):Acknowledgment 确认位为 1,Seq=Seq+1(1)。

  这三次握手过程中传送的包里没有数据,等三次握手完毕、建立通信后,客户端与服务器才正式开始传送数据。而且TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

最新文章

  1. ASP.NET集成模式下的管道事件
  2. Loadrunner中web_find和web_reg_find函数的使用与区别
  3. css3中变形与动画(二)
  4. VS2010调用Com组件
  5. document.cookie的使用
  6. 研究QGIS二次开发笔记(一)
  7. C#中Thread类中Join方法的理解(转载)
  8. hdu 4424 Conquer a New Region (并查集)
  9. 基于springmvc的简单增删改查实现---中间使用到了bean validation
  10. How to install vim on linux
  11. 面试中关于Java中涉及到知识点(转)
  12. linux中tar 打包指定路径文件
  13. 【重学计算机】机组D7章:总线
  14. 解决:Reading table information for completion of table and column names
  15. iframe-父子-兄弟页面相互传值(jq和js两种方法)
  16. java导出excel时合并同一列中相同内容的行
  17. RMAN:简单的duplicate创建新数据库 for 12c+
  18. SpringBoot 之配置server 信息
  19. LruCache DiskLruCache 缓存 简介 案例 MD
  20. 动态sql语句和动态传入参数个数

热门文章

  1. neutron源码分析(一)OpenStack环境搭建
  2. ubuntu12.04+openni+nit+SensorKinect环境搭建
  3. SSM整合AOP,日志框架和拦截器
  4. HTML条件注释判断浏览器版本命令
  5. SQL HAVING用法详解
  6. python之阶乘的小例子
  7. UITextView文字上方一段空白的解决方法
  8. Mac上安装第三方应用显示包资源破坏解决办法
  9. mysql数据库的笔记
  10. Function.bind 方法