在讲三次握手之前,希望大家理解一个概念,什么概念呢?
就是在我们的客户端和我们的服务器之间进行http请求,发送和返回的过程当中,我们是需要去创建一个tcp connection的东西,因为http是不存在连接这么一个概念的,它只有一个请求和响应这么一个概念,那么请求和响应都是一个数据包,它们之间是需要一个传输的通道的,那么这个传输的通道在哪里呢?就在tcp里面,去创建了这么一个从客户端发起,服务端接收的这么一个连接,这个连接呢,是可以一直保持在那边,然后我们的http请求是在连接这个基础上面去发送的,那这里就有一个概念,就是在tcp连接上面,是可以发送多个http请求的,在不同的版本里面,这个模式是不一样的
在http/1.0里面,这个连接是在http请求创建的时候,就去创建这个tcp连接,然后连接创建完之后,然后请求发送过去,然后服务器响应之后呢,这个tcp连接它就关闭了
然后在http/1.1里面,这个连接我们可以通过某种方式去申明这个连接可以一直保持在那边,然后保持在那边是什么意思呢?就是我们这个请求,第一个请求发送之后,这个连接没有关,然后第二个请求进来的时候,它还可以在这个连接上面进行发送,这有什么好处呢?就是因为tcp连接,我们这节课要讲的,在创建过程当中,是有三次握手这么一个消耗的,三次握手就是代表着有三次网络传输,客户端发送一次,然后服务端返回一次,然后客户端再发送一次,这个时候才创建了tcp连接,然后才能去发送http请求,所以如果把连接一直保持在那边,那么第二个http请求就没有三次握手的开销
在http2里面还有一个好处就是,http2里面tcp连接上面的http请求是可以并发的,这就导致什么呢,就是说我们同一个用户对同一个服务器发起一个网页请求的时候,它只需要一个tcp连接,那么具体什么含义呢,我们后期课程会详细的讲,现在要清楚tcp连接和http请求之间的关系

在http的三次握手当中,首先客户端发起一个我要发送一个数据包的请求,发送到服务端,这里面呢会有一个标志SYN=1,Seq=X,syn是一个标识,就是我这是一个创建请求的数据包,然后seq等于一个数字,一般来说都是1,然后服务端接收之后,知道了我有一个客户要跟我创建连接了,那创建这个连接之后呢,服务端就会开启一个tcp,socket的一个端口,然后这个端口开启了之后,它返回给客户端,它返回的数据里面也是一个SYN=1,ACK=X+1,Seq=Y,然后它会返回一个ACK,ACK就等于第一次发送过来的Seq,就是X,然后+1,然后它再发送一个Seq,这个是服务器端的一个Seq,然后客户端拿到之后,服务端允许我们打开创建这个连接,然后客户端再去发送它的ACK=Y+1,Seq=Z,它再发送一个Seq,等于一个新的数字Z,这就是tcp去创建的一个过程
为什么要进行这样一个三次握手呢,这是为了防止服务端这边开启一些无用的连接,因为我们知道网络传输是有延迟的,因为我们之间可能隔着非常远的距离,要通过一个光纤,然后各种中间的代理服务器来进行一个传输,在传输的过程当中,比如客户端发送一个SYN=1,创建连接的请求,如果服务端就直接创建了这个连接,然后返回内容给客户端,但是这个数据包因为网络传输的原因,它丢了,丢了以后,客户端就一直没有接收到服务器返回到这个东西,然后客户端可能设置了一个超时时间,关闭了,关闭了之后才发现一个新的创建连接的请求,这个时候服务端是不知道的,如果没有第三次握手,服务端根本不知道客户端有没有接收到我返回到信息,并且没有说要去创建还是关闭这个请求,服务端就开在那边,等着客户端发送实际到请求数据,那么这个时候服务端这个开销就浪费了,因为它不知道这个连接已经创建失败了,可能客户端已经创建新到连接去了,所以呢,我们需要三次握手,让客户端和服务端察觉到我们因为网络原因端一些问题导致数据没有查到,这个端口,这个连接已经关闭了,我们需要一直等在那边的情况,三次握手主要是规避网络传输当中延迟而导致服务器开销的一些问题
接下来看下三次握手数据包的相信内容,Wireshark抓包工具

13789是本机的一个端口,80是服务器端的一个端口,因为有三次握手,客户端和服务器之间有三个来回,只要找到同一个端口的来回,就可以找到这三次握手

如图,这三次是完整的三次握手的过程,第一次握手可以看到发送了一个SYN标示位,为了简单演示,说SYN=1,其实,就是SYN占据了第一个标识位,用图片只是为了更形象的展示这三个过程,返回的时候是一个SYN,再加上一个ACK。最后客户端再发送一个ACK给服务端,作为第一个标识位,这样一个过程就完成了一个三次握手

HTTP的三次握手的更多相关文章

  1. TCP三次握手的正确使用姿势

    背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声 ...

  2. TCP三次握手/四次挥手详解

    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...

  3. python网络编程-TCP协议中的三次握手和四次挥手(图解)

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  4. 简析TCP的三次握手与四次分手

    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...

  5. TCP的三次握手(建立连接)和四次挥手(关闭连接)

    参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...

  6. wireshark抓包工具简介以及tcp三次握手的一些含义

    wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了.为了安全考虑, ...

  7. 使用winshark分析三次握手,四次挥手

    三次握手 ip 106.120.167.67捕获的数据 数据信息   分析: 从图中可以看出,前三条为三次握手过程,使用TCP协议. 结合图,第一条为建立连接请求,客户端向服务器发送SYN=1的报文, ...

  8. TCP/IP协议三次握手与四次握手流程解析

    原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...

  9. tcp三次握手、四次挥手

    TCP的三次握手(建立连接)和四次挥手(关闭连接):http://blog.csdn.net/whuslei/article/details/6667471/ TCP协议中的三次握手和四次挥手(图解) ...

  10. 简述TCP连接的建立与释放(三次握手、四次挥手)

    在介绍TCP连接的建立与释放之前,先回顾一下相关知识. TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,H ...

随机推荐

  1. MVC中Cookies的简单读写操作

    写入 public static void WriteCookie(string cn, string cv, DateTime Time) { HttpCookie cookie = new Htt ...

  2. bios-----> grub

    系统有两块硬盘, 第一块安装的win7, 第二块安装ubuntu 默认从sda加载grub 如果在bios页面选择从sdb启动,会找不到grub 进入原来的sda系统,  grub-install / ...

  3. Vue.js-----轻量高效的MVVM框架(三、认识数据绑定)

    插值 1.文本插值 (1)双向数据绑定 v-model="msg0101",一旦v-model中的数值发生变化,所有用vue表达式{{msg0101}}的数据都会更新. (2)单次 ...

  4. python面向对象, 单例模式

    目录 单利模式 实现单利模式的方法 使用模块 使用__new__ 为了使类只能出现一个实例,我们可以使用 new 来控制实例的创建过程,代码如下: 使用装饰器 使用 metaclass 补充:元类(m ...

  5. Python操作列表

    1.List Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  6. Jersey框架简介

    一 Jersey简介 开发RESTful WebService意味着支持在多种媒体类型以及抽象底层的客户端-服务器通信细节,如果没有一个好的工具包可用,这将是一个困难的任务 为了简化使用JAVA开发R ...

  7. Fastjson中以is打头出现的问题,会生成两个变量

    解决办法: @JSONField(name = "isSelf")public boolean isSelf = false; 这样就不会生成两个谜题 self和isSelf了 h ...

  8. python的字符串操作

    1.修改大小写 (1)title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写.这很有用, 因为你经常需要将名字视为信息.例如,你可能希望程序将值Ada.ADA和ada视为同一个名 ...

  9. carousel 插件隐藏列表中几项导致左右切换出错

    1. 一般的应用场景: 用于左右快速切换显示的列表内容,比如对员工的切换. 对于这种情况必不可少需要按照部门进行搜索,目前我的做法是首次加载所有该用户可以查看的员工列表,选择部门后又选择的隐藏掉其他不 ...

  10. vue学习第二天 ------ 临时笔记

    学习链接: vue.js官方文档: https://cn.vuejs.org/v2/guide/index.html vue.js API: https://cn.vuejs.org/v2/api/# ...