- TCP/IP
- TCP/IP模型
- TCP三次握手与四次握手
- TCP 如何保证可靠传输
- HTTP协议
- 基本介绍
- 工作原理
- HTTP特性
- 请求方法
- HTTP 状态码
- URL
- HTTP与HTTPS的区别
- RESTful
TCP/IP
TCP/IP模型
TCP/IP不是一个协议,而是一个协议族模型,里面包括4个层:应用层,传输层,网络层与数据层(被视为OSI七层模型的简化版)
HTTP,TCP,IP在网络中分属不同的层。
应用层:HTTP,FTP,POP,SMTP等就属于这个层。应用层主要主要向用户提供一组应用程序,比如邮件发送,远程登录等
- DNS(域名系统)是一个将域名和IP地址相互映射的分布式数据库,它可以使人更方便的访问互联网(使用域名),而不用记住IP数串。
- HTTP(超文本传输协议)是互联网上应用最广泛的协议,所有万维网的文件必须遵守该协议。设计HTTP最初的目的是为了传输和接收HTML页面。
传输层:TCP和UDP属于这个层,该层用于提供两个节点间的数据传输。
- TCP:
- 面向连接(需要手动建立连接,确保连接通畅才会传输,网络设备会预留资源以确保连接通畅,通信完成后释放连接)
- TCP连接只能有两个端点,因此TCP连接只能一对一。
- TCP提供可靠传输:不重复,不丢失,无错序。(面向连接协议中发送端和接收端都会记录发送和接收的状态)
- UDP:
- 无连接(不需要事先建立连接,接收方也不会确认,无法提供可靠传输)
- UDP没有阻塞控制,因此网络尽管出现阻塞也不会降低传输速率。
- UDP支持一对多,多对多,一对一,多对一的传输。
- UDP提供最大努力传输:不保证数据可以成功传送(无连接的数据包每次发送的状态彼此之间独立,不记录)
无连接的优点:速度快(没有阻塞控制,也省了许多保证可靠传输的机制);可以实现多对一,一对多,多对多(面向连接的需要多个独立连接才能做到);且无连接是实现面向连接的基础(IP是无连接的,它是构建TCP/IP的基础)
网络层:IP属于这个层。网络层包括地址管理与路由选择,它决定数据通过什么路径来到达另一端。在这层数据被称为数据包。
网络接口层:通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
TCP三次握手与四次握手
三次握手目的是建立可靠的连接。这三次是确认双方都能正确发送并接收对方信息的最小次数。
第一次握手:客户端发送带有SYN标志的数据包到服务端,服务端可以由此确认自己正常接收了数据,也可以确认客户端正确发送了数据。但客户端无法确认任何事。
第二次握手,服务端发送带有SYN/ACK标志的数据包到客户端,证明了自己发送数据功能正常。客户端知道了自己接收发送功能都正常,也知道了服务端接收发送都正常,但服务端不知道客户端的接收功能是否正常,也不知道自己的发送功能是否正常。
第三次握手,客户端发送带有ACK标志给服务端,至此双方都确认了自己和对方接收、发送功能正常,连接正式建立。
SYN是客户端到服务端的确认标志;而ACK是反过来的确认标志。在TCP连接中,两者互相发送信息必须都无误才行。
之所以是三次握手而不是两次握手,主要原因是:如果客户端之前发了一个SYN,但是滞留在网络中没有传到服务端。如果只有两次握手,那么服务端之后如果收到这个过时请求不会再向客户端确认,而是直接建立连接,那么会白白浪费资源。
断开一个TCP连接需要四次挥手:
第一次挥手:客户端发送带FIN标志的数据包给服务端,告诉服务端客户端已停止传送数据。
第二次挥手:服务端发回客户端ACK,并进入CLOSE_WAIT状态,表示知道了。此时从客户端到服务端的传输通道关闭。(但反向通道没有关闭,于是此时连接处于半关闭状态)
第三次挥手:等到服务端的数据发送完毕后,它会再给客户端发一个FIN。
第四次挥手:客户端收到后返给服务端ACK,服务端收到后正式关闭通道。而客户端需要等待一段时间后再进入CLOSE状态。
之所以服务端不能在接收到ACK后立刻返回FIN,是因为终止数据传输的指令是上层应用层下达的,客户端只能终结自己这边的传输通道,而服务端的数据可能还没有传完。
最后,当客户端最终发给服务端ACK之后并不是马上CLOSE,而是等一段时间(通常是报文最大寿命时间),有两个原因:
- 第一,因为它需要确认服务端收到了ACK之后才会正式关闭。如果服务端没有收到ACK的话会重新发送给客户端FIN,然后客户端会再发一次ACK,并重新计时。
- 第二,它可以消灭所有残留的报文。这也是规避掉可能有滞留在网络的过时报文进入新的请求的情况。
TCP 如何保证可靠传输
- 应用数据被分割成TCP认为最适合发送的数据块。
- TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
TCP 的接收端会丢弃重复的数据。 - 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制:当网络拥塞时,减少数据的发送。
- 停止等待协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
- 超时重传: 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
HTTP协议
基本介绍
HTTP 是一个客户端终端和服务器端请求和应答的标准,是基于TCP/IP之上的应用层协议。通过使用浏览器、网络爬虫等工具,客户端发起了一个请求到服务器上指定端口,我们称这个客户端为用户代理程序。应答的服务器上会存储一些资源,我们称这个应答服务器为源服务器。在用户代理和源服务器之间有很多中间层,比如代理服务器、网关、隧道等。
工作原理
- 客户端(通常是浏览器)通过DNS查找到域名对应的IP地址。
- 根据IP地址,HTTP客户端与Web服务器的HTTP端口(默认为80)建立一个TCP连接。
- 通过TCP连接,客户端发送一个HTTP请求报文。
- 服务器接收请求,根据提供的参数,cookies等信息再生成HTTP响应,并将资源副本(通常是HTML)写到TCP套接字,由客户端读取。
- 释放TCP连接
- 客户端浏览器解析HTML内容。
例如:在浏览器地址栏输入一个url,回车后所经历的流程如下:
- 浏览器向DNS服务器请求解析该url中对应的IP地址。
- 解析到IP地址后,根据IP地址和端口号,和对应服务器建立TCP连接。
- 浏览器发出读取文件(URL中域名后面部分)的HTTP请求。该请求报文作为TCP三次握手的第三个报文的数据发送给服务器。
- 服务器对浏览器请求做出响应,并把对应的html文本发送给浏览器。
- 释放TCP连接
- 浏览器解析并显示html内容。
HTTP特性
- 基于请求-响应模式
HTTP协议规定,请求由客户端发出,然后服务器端进行响应。如果客户端没有请求,服务器端也不会响应。 - 无状态
HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说,如果该事务后续处理要求前边的信息,则必须要重新传输。这样的好处时当每个事务是独立的时,它的响应速度会很快,但也意味着如果事务间有联系的话则需要传入重复的数据。对此引入cookies技术,该技术可以保持一个状态(比如用户登录了网站,但是他跳转的同时需要保持登录状态)。 - 无连接
无连接意味着服务器一次链接处理一个请求,当完成响应并且得到客户端应答后即断开。采用这种方式可以节省传输时间,并且提高并发性能。
请求方法
HTTP定义了八种方法来操作指定的资源:
- GET:请求指定的资源,并返回实体本体。
- HEAD:也是请求指定资源,但不会返回具体内容,用于获取报头。
- POST:向指定资源提交数据。(这个请求可能会导致新资源的创建或者旧资源的修改)
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除指定的数据。
- TRACE:回显服务请求,用于测试诊断。
- OPTION: 这个方法可使服务器传回该资源所支持的所有HTTP请求方法,允许客户端查看服务器是否正常运行。
- HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
HTTP 状态码
1xxx(信息):请求已服务器接收,继续处理。
2xxx(成功):请求已被服务器成功接收,理解。
3xxx(重定向):需要后续操作。
4xxx(客户端错误):请求无法实现。
5xxx(服务器错误):服务器在实现某个正常请求时出现问题
常见状态码:
200 OK: 请求成功
301 Moved permanently:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
400 Bad request:请求有语法错误,服务器无法理解
402 Unauthorized:请求要求用户的身份认证
403 Forbidden:服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found:服务器无法根据客户端的请求找到资源(网页)。
500 Internal Server Error:服务器内部错误,无法完成请求
URL
URL,全称是Uniform Resource Locator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
以下是一个url应有的格式:
http://www.mmm.com:80/max?name=max&age=26#first
- http表示协议;
- www.mmm.com表示域名部分(也可以直接使用IP地址)
- :80是一个端口部分,如果省略的话则使用默认端口。
- /max表示虚拟路径部分,从第一个/开始到?为止,包括目录与文件名。
- ?开始之后表示参数部分,有两种方法设置参数:
- 以?开始,以&进行参数分割,以=匹配键和值:
http://120.0.0.1:8000/admin?name=max&age=30 - 用分隔符来分
http://120.0.0.1:8000/admin/max/30 #(感觉容易和路径混淆。)
- 以?开始,以&进行参数分割,以=匹配键和值:
-
到最后是锚部分(不是必须的)
HTTP与HTTPS的区别
HTTP以明文形式在浏览器和服务器之间传递信息,不提供加密。如果攻击者截取了报文,则可以直接窃取信息。
HTTPS则在HTTP的基础上添加了SSL加密协议。SSL依靠证书来验证服务器的身份,并且为客户端与服务端的通信提供加密。HTTPS协议更安全,但是在握手时也更耗时。
RESTful
什么是REST?
Representation State Transfer:表现层状态转化。
表现层意思是“资源的表现方法”,比如文本的表现方法是txt文件,图片的表现方法是jpg等。而状态转化的意思是“通过某种手段让服务器发生变化”。这种手段就是HTTP协议操作。综上所述,REST的意思是:
- Resources:使用URL定位资源。
- Representation:在客户端与服务端,传递资源的表现层
- State Transfer:使用4个HTTP动词(GET,POST,PUT,DELETE)对服务器进行操作。
REST是网络中client与server之间的交互风格,REST本身不实用,实用的是如何写出RESTful的API。
- URI使用名词而不是动词,且名词最好是复数。
- 具体动词使用HTTP的操作符GET,POST等
- 使用HTTP status code 来传递状态信息,比如404什么的。
- 传递资源的某种表现形式(比如json,html,jpg等)