HTTP协议和TCP协议
HTTP协议
什么是HTTP
HTTP协议规定了浏览器怎样向万维网服务请求万维网文档,以及服务器怎样把文档传送给浏览器。在服务器和浏览器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这些格式和规则就是超文本传送协议HTTP。
HTTP规定在HTTP客户和HTTP服务器之间的每次交互,都由一个ASCII码串构成的请求和一个类似的通用因特网邮件扩充,即“类MIME(MIME-like)”的响应组成。HTTP报文通常都使用TCP连接传送。
当在地址栏输入www.baidu.com的时候会发生是什么
1、DNS解析地址
2、找到相应的服务器
3、TCP的三次握手建立TCP连接
4、找到入口文件
5、解析入口文件
6、TCP的四次挥手
7、返回资源页面
HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP协议本身是无连接的。也就是说,HTTP虽然使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接。
HTTP协议是无状态的。也就是说,同一个客户第二次访问同一个服务器上的页面的时候,服务器的响应与第一次被访问的时候一样,但是服务器并不知道你曾经访问过这个页面,也不记得你曾经访问过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
HTTP报文结构
HTTP有两类报文:
请求报文——从客户向服务器发送请求报文
响应报文——从服务器到客户的回答
由于HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的。
HTTP请求报文和响应报文都是由三个部分组成。这两种报文格式的区别就是开始行不同。
1、开始行,用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行,在响应报文中的开始行叫做状态行。
2、首部行,用来说明浏览器、服务器或报文主体的一些信息。
3、实体主体,在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。
请求报文:
请求报文的第一行“请求行”只有三个内容:方法、请求资源的URL、HTTP的版本
请求报文的方法
响应报文:
响应报文的第一行就是状态行,状态行包括三项内容:HTTP的版本、状态码、解释状态码的简单短语。
状态码都是三位数字,分为5大类共33种
1xx 表示通知信息的,如果请求收到了或正在进行处理
2xx 表示成功,如接受或知道了
3xx 表示重定向,如要完成请求还必须采取进一步的行动
4xx 表示客户的差错,如请求中有错误的语法或不能完成
5xx 表示服务器的差错,如服务器失效无法完成请求
TCP协议
TCP的主要特点
1、TCP是面向连接的传输层协议。也就是说应用程序在使用TCP协议之前,必须先建立TCP连接
2、每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)
3、TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达
4、TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能够返送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
5、面向字节流。TCP中的流指的是流入到进程或者从进程流出的字节序列。
建立一个TCP需要三步
1:客户端向服务端发出了请求连接请求报文, 首部中的同部位SYN=1,同时选择一个厨师序号seq = x。这时,客户端进入SYN-SENT(同步已发送)状态
2:服务端收到请求报文后,如果同意建立连接,则向客户端发送确认。在确认报文中SYN和ACK都置1,确认号是 ack = x + 1,自己选择一个初始序号seq = y,服务器进入SYN-RCVD(同步收到)状态
3:客户端收到服务端确认后,还要想服务端给出确认。确认报文段的ACK置1,确认号2 ack = y + 1,自己的序号 seq = x + 1。这是TCP的连接已建立,客户端进入ESTABLISHED(已建立连接)状态。
当服务端收到客户端的确认后,也进入ESTABLISHED状态
为什么客户端还要在发送一次确认呢?
这是为了防止已失效的链接请求报文突然又传到了服务端。因而产生错误
“已失效的连接请求报文”是这样产生的:
客户端发出了第一个连接请求,由于网络等原因导致长时间滞留但是没有丢失,以致延误到连接释放以后的某个时间才到达服务端。按理说这应该是一个早就失效的报文段,但是服务端收到这个失效的报文段后,他不知道你是失效的报文噻,所以就会误以为客户端有发来了一个请求,于是就向客户端发出了确认报文同意连接。假设我们没有第三次的握手,那岂不是又建立了一个连接。
但是我客户端并没有发出建立连接的请求啊,所以我就不搭理服务器,不给你发送数据。但是服务器以为新的连接已经建立好了,等着你客户端发来数据他就一直等啊等啊等啊,确怎么也等不到。这样就会导致服务器的许多资源就这么浪费了。
参用了三次握手的办法可以防止上述现象的发生,就如刚才的情况,服务器收不到客户端的确认就知道客户端没有要求建立连接。
我理解的区别
TCP是传输层协议,定义数据传输和连接方式的规范。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
HTTP 超文本传送协议(Hypertext Transfer Protocol )是应用层协议,定义的是传输数据的内容的规范。
HTTP协议中的数据是利用TCP协议传输的,特点是客户端发送的每次请求都需要服务器回送响应,它是TCP协议族中的一种,默认使用 TCP 80端口。
好比网络是路,TCP是跑在路上的车,HTTP是车上的人。每个网站内容不一样,就像车上的每个人有不同的故事一样。