01-http简介-四层 七层 三次握手
接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的。接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单的聊一下TCP/IP协议族,然后聊一下HTTP协议,然后再聊一下SSL上的HTTP(也就是HTTPS)了。当然TCP/IP协议族是个老生常谈的话题,网络上关于该内容的文章一抓一大把呢,但是鉴于其重要性,还是有必要系统的总结一下的。
1. TCP/IP协议族简述
在聊HTTP与HTTPS之前呢,我们先简单的聊一下TCP/IP协议族。TCP/IP不单单指的就是TCP和IP这两个协议,而是指的与其相关的各种协议。比如HTTP, FTP, DNS, TCP, UDP, IP, SNMP等等都属于TCP/IP协议族的范畴。
1.1. TCP/IP协议的分层
TCP/IP协议族是分层管理的,在OSI标准中可以分为7层(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层,可记为:应表会传网数物),本篇博客我们采用的是TCP/IP协议族中的四层(应用层、传输层、网络层、链路层)。下方是对四层中每层的简单介绍:
- 应用层:该层是面向用户的一层,也就是说用户可以直接操作该层,该层决定了向用户提供应用服务时的通信活动。本篇博客要聊的HTTP(HyperText Transfer Protocol:超文本传输协议)就位于该层。我们经常使用的FTP(File Transfer Protocol: 文件传输协议)和DNS (Domain Name System: 域名系统)都位于该层。FTP简单的说就是用来文件传输的。而DNS则负责域名解析的,通过DNS可以将域名(比如:www.cnblogs.com)与IP地址(201.33.xx.09)进行相互的转换。在7层中,又将该层分为:应用层、表示层和会话层。
- 传输层:应用层的下方是传输层,应用层会将数据交付给传输层进行传输。TCP(Transmission Control Prococol:传输控制协议)和UDP(User Data Protocol: 用户数据协议)位于该层,当然见名知意,该层是用来提供处于网络连接中的两台计算机直接的数据传输的。TCP建立连接是需要三次握手来确认连接情况,而UDP则没有三次握手的过程。稍后会介绍。
- 网络层:传输层的下方是网络层,网络层用来处理在网络上流动的数据包,IP(Internet Protocol: 网际协议)就位于这层。该层负责在众多网络线路中选择一条传输线路。当然这个选择传输线路的过程需要IP地址和MAC地址的支持。
- 链路层:在7层协议中,将链路层分为数据链路层和物理层。该部分主要是用来处理网络的硬件部分,我们常说的NIC(Net Work Card),也就是网卡就位于这一部分,当然光纤也是链路层的一部分。
在TCP/IP协议族中的每次直接在传输数据时的协作关系,以及交互过程,还是引用《图解HTTP》一书上的一张图来解释吧。下图就是这四层协议在数据传输过程中的工作方式。下面这张图还是相当直观的。在发送端是应用层-->链路层这个方向的封包过程,每经过一层都会增加该层的头部。而接收端则是从链路层-->应用层解包的过程,每经过一层则会去掉相应的首部。
1.2. TCP协议的三次握手
在聊HTTP协议之前,我们先简单的聊一下TCP三次握手的过程,在后面的博客中我们将会对TCP和IP协议进行详述,本篇博客就先简单的聊一下做HTTP协议的基础。
TCP协议位于传输层,为了确保传输的可靠性,TCP协议在建立连接时需要三次握手(Three-way handshaking)。下方这个简图就是TCP协议建立连接时三次握手的过程。
- 第一次握手:发送端发送一个带SYN(Synchronize [ˈsɪŋkrənaɪz]使同步)标志的数据包给接收端,用于询问接收端是否可以接收。如果可以,就进行第二次握手。
- 第二次握手:接收端回传给发送端一个带有SYN/ACK(Acknowledgement [əkˈnɒlɪdʒmənt]确认)的数据包,给发送端说,我收到你给我发送的SYN标志了,我再给你传一个ACK标志,你能收到吗?如果发送端收到了SYN/ACK这个数据包,就可以确认接收端收到了之前发送的SYN, 然后进行第三次握手。
- 第三次握手:发送端会给接收端发送一个带有ACK标志的数据包,告诉接收端我可以收到你给我发送的SYN/ACK标志。接收端如果收到了这个来自客户端的ACK标志,就意味着三次握手完成,连接建立,就可以开始传输数据了。
1.3. TCP协议的四次挥手
TCP三次握手是TCP连接建立的过程,TCP四次挥手则是TCP连接释放的过程。下面是TCP四次挥手的流程图:
当客户端没有数据再需要发送给服务端时,就需要释放客户端的连接,这整个过程为:
- 客户端发送一个报文给服务端(没有数据),其中FIN设置为1,Sequence Number置为u,客户端进入FIN_WAIT_1状态
- 服务端收到来自客户端的请求,发送一个ACK给客户端,Acknowledge置为u+1,同时发送Sequence Number为v,服务端进入CLOSE_WAIT状态
- 服务端发送一个FIN给客户端,ACK置为1,Sequence置为w,Acknowledge置为u+1,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态
- 客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务端,Acknowledge置为w+1,Sequence Number置为u+1,最后客户端和服务端都进入CLOSED状态
这里的一个问题是,为什么TCP连接的建立只需要三次握手而TCP连接的释放需要四次握手呢:
因为服务端在LISTEN状态下,收到建立请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而连接关闭时,当收到对方的FIN报文时,仅仅表示对方没有需要发送的数据了,但是还能接收数据,己方未必数据已经全部发送给对方了,所以己方可以立即关闭,也可以将应该发送的数据全部发送完毕后再发送FIN报文给客户端来表示同意现在关闭连接。
从这个角度而言,服务端的ACK和FIN一般都会分开发送。
2. HTTP报文结构
HTTP协议全称是HyperText Transfer Protocol,即超文本传输协议,用户客户端和服务器之前的通信,目前普遍使用版本为HTTP/1.1。协议本质上就是规范,我们之前提到过的“面向接口”编程,其实就是“面向协议”编程。先定义好类的协议,也就是接口,相关类都遵循该协议,这样一来我们就规范了这些类的调用方式。而HTTP协议是规范客户端和服务器之间通信的协议。也就是说所有的客户端或者服务器都遵循了HTTP这个通信协议,那么也就是意味着他们对外传输数据的接口是一直的,就可以在其中间连接上管道,这样一来就可以进行传输了。
这些协议就是接口,有着共同的通信协议,多个端就可以相互通信。采用相同的协议,就是便于个个设备之间进行沟通交流。HTTP协议的作用如下所示。
HTTP协议的作用是用来规范通信内容的,在HTTP协议中可以分为请求报文和响应报文。顾名思义,请求报文是请求方发出的信息,而响应报文是响应端收到请求后响应的内容。接下来我们就来看看请求报文和响应报文的整体结构。
1.1. 请求报文(Request Message)结构
下方是请求报文的整体结构。请求报文主要分为两大部分,一个是请求头(Request Headers)另一个是请求体(Request Body)。这两者之间由空行分割。在请求头中又分为请求行(Request Line),请求头部字段,通用头部字段和实体头部字段等,这个稍后会详细介绍。下方就是请求报文的结构。
下方这个截图就是请求博客园某个页面时的Request Headers。在请求行中的第一个“GET”是当前请求的方法,稍后会做介绍。中间的就是请求资源的路径,最后一个HTTP/1.1就是当前使用请求协议及其版本。下方这些就是请求头了,稍后会对常用的请求头进行解说。而请求体就是你往服务端传输的数据,比如form表单神马的。
1.2. 响应报文(Response Message)结构
聊完请求报文,接下来我们来聊聊响应报文,响应报文的结构与请求报文的结构类似,也分为报文头和报文体。下方就是响应报文的结构图。响应头(Response Headers)分为状态行(State Line),响应头部字段,通用头部字段、实体头部字段等。响应头与响应体中间也是有空行进行分割的。
下方截图就是上述请求报文发出后的响应头,响应体就是对于的HTML等前端资源了。在响应头中,第一行就是状态行,“HTTP/1.1”表示使用的HTTP协议的1.1版本,状态200表示响应成功,"OK"则是状态原因短语。常用状态,稍后会详细介绍。
01-http简介-四层 七层 三次握手的更多相关文章
- 简单聊聊四层/七层模型到HTTP
本文内容借鉴这篇博客:https://blog.csdn.net/agzhchren/article/details/79173491 但是这篇博客也是该博主转载的,文章具体出处我没有找到,如果有人知 ...
- Web负载均衡学习笔记之四层和七层负载均衡的区别
0x00 简介 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. ...
- linux负载均衡总结性说明(四层负载/七层负载)
在常规运维工作中,经常会运用到负载均衡服务.负载均衡分为四层负载和七层负载,那么这两者之间有什么不同?废话不多说,详解如下: 一,什么是负载均衡1)负载均衡(Load Balance)建立在现有网络结 ...
- 四层and七层负载均衡
四层负载/七层负载 在常规运维工作中,经常会运用到负载均衡服务.负载均衡分为四层负载和七层负载,那么这两者之间有什么不同? 废话不多说,详解如下: 1. 什么是负载均衡 1)负载均衡(Load ...
- 网络编程简介(OSI七层协议,TCP协议原理,三次握手与四次挥手)
目录 网络编程 软件开发架构 C/S架构 B/S架构 网络编程的发展史 互联网协议 1.物理连接层 2.数据链路层 3.网络层 4.传输层 5.应用层 三次握手四次挥手 三次握手建链接 数据传输 四次 ...
- 01网络编程(基础知识+OSI七层协议+TCP与UDP)
目录 01 网络编程 一.软件开发架构 1.1 CS架构 1.2 BS架构 二.网络理论前戏 2.1 简介 2.2 常见硬件 三.OSI七层协议(五层) 3.1 七层协议 3.2 五层协议 3.3 知 ...
- 网络知识学习1---(基础知识:ISO/OSI七层模型和TCP/IP四层模型)
以下的内容和之后的几篇博客只是比较初级的介绍,想要深入学习的话建议自己钻研<TCP/IP详解 卷1:协议> 1.ISO/OSI七层模型 下四层是为数据传输服务的,物理层是真正的传输数 ...
- OSI七层网络模型与TCP/IP四层模型介绍
目录 OSI七层网络模型与TCP/IP四层模型介绍 1.OSI七层网络模型介绍 2.TCP/IP四层网络模型介绍 3.各层对应的协议 4.OSI七层和TCP/IP四层的区别 5.交换机工作在OSI的哪 ...
- OSI七层与TCP/IP四层(小结)
OSI 七层模型 我们一般使用的网络数据传输由下而上共有七层,分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层,也被依次称为 OSI 第一层.第二层.⋯⋯. 第七层. 各层功能简介 1 ...
随机推荐
- tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
部署项目时候,发现启动特别慢,要等好几分钟,这不正常啊.然后每次部署都停留在 At least one JAR was scanned for TLDs yet contained no TLDs. ...
- linux 设置git记住密码
linux下: 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入: https://{username}:{password}@github.com 注 ...
- 电脑断电后Everything部分文件搜索不到的解决办法
常规检查:查看选项→索引→NTFS,确认所有分区都[包含到数据库],确认后,再删除数据库文件,点击[强制重建] 下面方法是亲身经历,是断电造成的,费了不少时间才解决,现分享出来: 断电后,Everyt ...
- 文本处理三剑客之 grep
grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...
- selenium+python 数据驱动-txt篇
#循环读取txt文件中的数据,可以作为用户名,密码等使用from selenium import webdriver #创建两个列表user=[]pwd=[]f=open(r'C:\bbs\data\ ...
- February 20 2017 Week 8 Monday
Behind every beautiful thing, there's some kind of pain. 美丽背后,必有努力. No pains, no gains, and sometime ...
- .NET控件命名规范
一.基本数据类型前缀 数据类型 数据类型简写 Array arr Boolean bln Byte byt Char chr DateTime dtm Decima ...
- S/4HANA服务订单Service Order的批量创建
我工作中接到一个任务,需要在性能测试系统里创建一亿条服务订单service order来做性能测试. 这么大规模的数据量,当然只能用代码来创建了. 本文提到的所有ABAP代码,我均已上传到我的Gith ...
- SAP R/3系统的R和3分别代表什么含义,负载均衡的实现原理
1972年,SAP诞生,推出了RF系统(实时财务会计系统), 后来命名为R1. R指Real time.3既指第三代系统,又代表3层架构. 三层架构分别为下图的Presentation server ...
- python UI自动化实战记录六:页面1用例编写
使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...