TCP/IP、Http协议和socket之间的区别
网络由下往上分为(OSI七层模型),实际中使用更多的是右边的TCP/IP参考模型:
对于TCP/IP四层模型我们可以简单的理解为:
- 网络接入层:将需要互相连接的节点接入网络中,从而为数据传输提供条件。
- 网际互联层:找到要传输数据的目标节点。(IP协议)
- 传输层:实际传输数据。(TCP、UDP协议)
- 应用层:使用接受到的数据(HTTP、HTTPS、DNS协议)
从这里我们可以简单的了解到,IP协议对应网际互联层,只负责找到地址;TCP协议对应传输层,负责具体的传输工作;HTTP协议对应应用层,负责对接收到的数据进行解析;三者从本质上来说,没有可比性。
而我们平时说的最多的socket是什么呢?实际上socket是对TCP/IP协议的封装,socket本身不是协议,而是一个调用接口(API),我们通过socket实现TCP/IP协议,但socket跟TCP/IP协议没有必然联系。
WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP协议作传输层协议将它发到网络上
一、TCP/IP协议
建立一个TCP连接需要进行“三次握手”,而断开一个TCP连接时需要进行四次挥手,过程如图:
**seq:**表示所传数据的序号。TCP传输每一个字节都有一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接收完整了,如果没有接收完整就需要重新传送,以保持数据的完整性。
**ack:**表示确认号,接收端用它来给发送端反馈已经成功接收到的数据信息,它的值为希望接受的下一个数据包起始序号,也就是ack值所代表的序号前面数据已经成功接收到了。
**ACK:**确认位,只有ACK=1的时候ack才起作用。正常通信时ACK为1,第一次发起请求时应为没有需要确认接收的数据所以ACK为0。
**SYN:**同步位,用于在建立连接时同时序号。刚开始建立连接时并没有历史接收数据,所以ack也就没办法设置,这时按照正常的就无法运行了,SYN的作用就是来解决这个问题的,当接收端接收到SYN=1的报文时就会直接将ack设置为接收到的seq+1的值,注意这里面的值并不是校验后设置的,而是根据SYN直接设置的,这样正常的机制就可以运行了,所以SYN叫同步位。需要注意的是,SYN会在前面再次握手时都为1,这是因为通信的双方的ack都需要设置一个初始值。
1、第一次握手:客户端向服务端发送syn包,将标志位SYN位置置为1,并随机产生一个seq=x,并将该数据包发送给服务端(即syn包),客户端进入SYN_SENT状态,等待服务端确认。
2、第二次握手:服务器收到syn包,由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和确认位ACK都置为1,将确认号ack =x+1,随即产生一个值seq = y,并将该包发送给客户端(即syn+ack包),服务器进入syn_send状态。
3、第三次握手:客户端收到服务器的syn+ack包,检查ACK是否为1,确认号ack是否为x+1,如果正确则将ACK置为1,ack=y+1,并向服务器发送该确认包,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才开始正式传送数据。
理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都会一直保持下去。
断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”,断开连接的可以是客户端,也可以是服务端,这里用客户端断开来举例:
1、客户端发送一个FIN=M给服务器,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态,意思是客户端没有数据要发送给服务端 了,但是服务端依然可以向客户端发送数据。
2、服务端收到FIN后,先发送ack=M+1给客户端,告诉客户端你的请求我收到了,但我还没准备好,请你继续等我的消息。这个时候客户端进入FIN_WAIT_2状态,继续等待服务器的报文。
3、当服务器确认所有数据已发送完成,则向客户端发送FIN=N,此时客户端和服务端均不再发送数据。
4、客户端收到FIN=N后,就知道可以关闭连接了,于是发送ack=N+1通知服务端并进入TIME_WAIT状态,客户端等待2MSL后没有收到回复则自动关闭连接。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况。
TCP和UDP的区别
- TCP:面向连接,可靠的,速度慢效率低,适用于需要传输可靠的数据时使用。
- UDP:无连接,不可靠,速度快、效率高,适用于高效传输忽略可靠性时使用。
二、Http协议
Http是应用层协议,在TCP/IP协议接收到数据之后通过HTTP协议来解析才可以使用。
-
Http的请求过程
1、域名解析
2、发起TCP的3次握手
3、建立TCP连接后发起Http请求
4、服务器端响应Http请求,并回传数据
5、客户端获取数据并解析展示在前端界面 -
Http的报文格式
请求报文首行是请求行,包括方法(请求类型)、URL和Http版本;
响应报文首行是状态行,包括Http版本、状态码和简短原因(可无)
头部保存一些键值对的属性,用冒号分割
主体保存具体内容,请求报文中主要保存POST类型的数据,响应报文中保存页面想要的结果。
首行、头部和主题以及头部各项内容用回车换行分割,头部和主体之间有两个连续的回车换行。
请求报文中的方法是指:GET、POST、PUT、HEAD、DELETE等类型
响应报文中的状态码是reponse中的status,一共可分为5类:1xx:信息性状态码; 2xx:成功状态码,如200表示成功 3xx:重定向状态码,如301表示重定向 4xx:客户端错误状态码,如404表示没有找到请求的资源 5xx:服务端错误状态码,如500表示内部错误
-
Http的特点
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。 2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。
通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
三、Https协议
Https是一种Http加密安全版的协议,在Http连接的基础上,对数据采用SSL的加密方式,使得在没有密钥的情况下,根本无法破解其中的数据,保证了其中的安全性。它仍然使用的http进行数据的传输,不同的是https传输的数据都是经过tcp和http之间的ssl层进行加密的。
Http与Https差异比较
1、https协议需要到ca申请证书,一般免费证书很少,需要交费。
2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。