在讲三次握手之前,希望大家理解一个概念,什么概念呢?
就是在我们的客户端和我们的服务器之间进行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. mysqldump的用法

    1.mysqldump 是文本备份还是二进制备份 它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象.它也有 insert 语句来使用数据构成表. mysqldump可产生两 ...

  2. gitignore 忽略某文件夹下 非某后缀名的文件

    忽略指定文件夹下的除某一文件之外的其他文件 parent_dir/!spec_file_name.html 忽略指定文件夹下的除某一类后缀名的文件 parent_dir/*[!*.html] 注意:若 ...

  3. ajax 工作原理以及其优缺点

    1.什么是AJAX?AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它使用:使用XHTML ...

  4. nginx -s reload "/alidata/server/nginx/logs/nginx.pid" failed

    [root@snoopy :: vhosts]# nginx -s reload nginx: [error] open() : No such file or directory) 修改完nginx ...

  5. java——Class、动态加载

    Class和Object混淆了? Object: 任何类都是Object类的子类 Class: 任何类都是Class的实例对象 Class可以说是一种特殊的类,它表示的是类类型,Object仍然是Cl ...

  6. Centos6.10搭建Hadoop三节点分布式

    (一)安装JDK 1. 下载JDK,解压到相应的路径 2.  修改 /etc/profile 文件(文本末尾添加),保存 sudo vi /etc/profile # 配置 JAVA_HOME exp ...

  7. ASP.NET中多语言的实现

    一个网站可能具备多个语言,要实现这个功能在ASP.NET中是非常简单的.我们需要为项目添加资源文件文件夹,并且添加针对网站的特定的资源文件等即可.在ASP.NET中资源文件分成两类:全局和页面级(即“ ...

  8. VMware 虚拟机(linux)增加根目录磁盘空间

    VMware 虚拟机(linux)增加根目录磁盘空间     今天查看学校的监控报修系统,不能访问了!!!系统运行很慢,用top命令查看发现内存使用率90%,用"df -h ”查看“/”目录 ...

  9. DataGridView进度条列 C# WinForm

    先看看效果,如果感兴趣,继续往下看…… 效果如下图所示: DataGridView里没有Pragress列,但有Image列,有了它我们可以自己绘图来实现进度条.其实实现起来并不困难. 首先在实体类增 ...

  10. [转]Linq语法二

    本文将讲述LINQ的基础查询(此文所有例子都使用LINQ to Object) 在此之前,我们先创建一个用于示例的数据源: Student类:表示学生,包括学号.姓名及班级 Courses类:表示学生 ...