TCP、HTTP的概念、关联,HTTP1.0/1.1/2.0的区别

TCP其实是HTTP和SOCKET的载体。当然SOCKET也可以基于UDP,这里我讲的是大部分情况下。只有TCP建立连接,HTTP和SOCKET才能正常工作,TCP就相当于摸金校尉,先把路线摸清楚了,跟搬山确认,搬山才能运输。

TCP部分

TCP三次握手:

1、client发送SYN=1和随机的sequence number给server,同时自身进入Syn_send状态

2、server接收到客户端的SYN之后就知道有人要跟我连接,并且返回自己的SYN(=1),AKC(=1),一个acknowledge number(=client sequence number +1),还有个随机sequence number给客户端,并进入SYN_RCVD状态

3、clinet收到server的确认信息后,检查acknowledge number是否是sequence number+1,ACK是否=1,检查完成后,发送ACK(=1),acknowledge number(server sequence number+1)给server,之后状态变更为establish。Server在检查完ACK=1,acknowledge = sequence number+1后也进入establish状态,完成三次握手。

补充:看见有个博客的图片不错

这个老哥的图片:https://blog.csdn.net/a_tu_/article/details/80389878

Question :

可以二次握手吗?

no,如果client延迟发送了握手,此时clent也没有进行多余的访问,那么server在延迟接收到握手请求后就建立连接,但是此时clent没有新的消息发送,server就会一直存活着等待clent发送数据,server的很多资源就被浪费了,而这只是一种情况,如果高并发的情况下,会有更多资源浪费。

可以四次握手吗?

可以,但是没必要,效率比三次的低

四次握手指的是在第二步握手的时候本来只发送ACK和acknowledge number,第三部再发送sequence number和SYN,原来的第三步变成第四步。现在两步并成一步,更快,效果相同。

第三次握手中,如果clent的ACK没有发送给server,此时server会怎么办?

会继续发送SYN,ACK,acknowledge number和sequence number给clent,总共持续默认5次,过后会自动关闭连接。

如果client想服务器发送数据,server会返回RST包响应。

如果连接成功了,但是clent又挂了,server端会发生什么?

server端会有一个计时器,在收到clent请求后刷新计时器,如果2小时(通常)没有接受到请求,server会每75秒发送一个探测报文,如果连发10次还是没收到回应,那么server就会关闭连接。

sequence number是个啥?

简单来说就是32位的序列号,随机。比如说发送了初始序列号为1000,则之后对要传输的数据编号为:1001,1002......

三次握手建立连接,那么正常关闭连接呢?

四次挥手

1、clent发送FIN(=1)和sequence number给server,并且状态改成FIN_WAIT_1

2、server接收到clent的FIN之后,发送ACK(=1)和acknowledge(=sequence number+1)给clent,此时客户端已经没有要发送的数据了,但是不妨碍服务端发送数据给客户端,此时server端的状态为CLOSE_WAIT。

3、当服务端完成给客户端发送数据之后,服务端发送FIN(=1)和sequence number给clent,并且更改状态为LAST_ACK

4、客户端接收到服务器的FIN之后,进入TIME_WAIT状态。然后客户端将ACK(=1),acknowledge number(sequence number+1)给服务器,服务器收到后确认acknowledge number,变为CLOSE状态,并不再向clent端发送数据。client等待报文最长寿命时间后也进入close阶段,完成四次挥手。

那么问题来了,为啥建立只要3次,关闭反而要4次呢?

因为中间有个等待数据全部传输完成的阶段,只能等待服务端数据全部传输完成后,服务端才会发FIN给客户端表示可以关闭了,数据发完了。

如果第二次挥手时,服务器没有发送ACK成功,那客户端怎么办?

客户端没收到ACK确认,会再次发送FIN

在理解上面四次挥手时,最后一次挥手有个TIME_WAIT状态,不觉得很奇怪吗,关都要关了,还要wait干嘛?

其实这个的作用还是为了防止客户端和服务端之一没法关闭,比如客户端发送ACK丢失了,服务端一直没有收到,肯定关不了啊,那么TIME_WAIT状态情况下,client在发送ACK之后会等待2*MSL的时间,在这时间范围内SERVER如果没有收到,会再次发送FIN给client告诉他我没收到,你重新发一份确认,如果2*MSL时间过后没有收到FIN那么表示server关闭成功了,我也可以关闭了。

MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

 

TCP是如何实现流量控制的?

滑动窗口。滑动窗口有很多地方有这个概念,比如spark streaming,也有个窗口。TCP是靠窗口来实现流量控制的,在一个窗口期内,包含client已发送已处理,clinet已发送未处理。已发送未处理的部分会放到缓存中,等待处理。只有窗口期最后一个结束,窗口才会右移。窗口字段大小决定了使用缓存的大小,以字节为单位,由于缓冲区大小在TCP头部只有16位来表示,也就是说最大值为2^16-1=65535。但是对于一些情况来说需要使用更大的滑动窗口,这时候就要使用扩展的滑动窗口,如光纤高速通信网络,或者是卫星长连接网络,需要窗口尽可能的大。这时会使用扩展的32位的滑动窗口大小。

那么窗口什么时候滑动呢?

在收到clent数据后,自己确认了数据的正确性,这时候会吧这些数据放入缓冲区,等待应用程序获取。那这时候需要发送确认ACK给clent,而且数据还没被应用程序取走,这时候就需要窗口合拢,缓冲区的窗口左边缘向右滑动。

上面只讲了左边缘向右滑动,那什么时候右边缘向右滑动呢?

当窗口合拢后,应用程序一旦从缓冲区中提取数据,那么窗口右边缘向右滑动。而且向右滑动后会把之前缓冲区的空间填充到窗口内。

HTTP部分

HTTP:众所周知,超文本传输协议。

HTTP和HTTPS的区别:

1.默认端口不同,HTTP是80,HTTPS是443

2.HTTP是明文传输,HTTPS是运行在SSL(Secure Socket Layer)之上的,增加了加密和认证机制,更加安全。

3.HTTPS加密解密会带来更大的CPU和内存开销

4.HTTPS通讯需要证书,一般需要向证书颁发机构(CA)购买

HTTPS是如何连接的?

网上资料太多了,我挑选了一些比较简单明了的说明

你访问网站时一般不会输入http或者https,那接收到服务端传来的消息后怎么就成了https了呢?

HSTS(https strict transport secure),在响应header部分添加“Strict-Transport-Security "max-age=63072000;” includeSubdomains;”,会强制让用户访问https。

Strict-Transport-Security 是 Header 字段名, 后面的 max-age 代表 HSTS 在客户端的生效时间。 includeSubdomains 表示对所有子域名生效。

对称加密和非对称加密是啥意思?

对称加密:加密解密是一套算法,如DES/AES/3DES

非对称加密:加密解密是不同算法,公钥加密,私钥解密

那请求的方式,GET和POST又有什么区别呢?

1.GET请求的信息存放在UTL之后,在HTTP请求头中,POST的请求在请求体中

2.GET的请求是幂等的,即读取同一个资源,得到相同的数据。POST不是幂等的。

3.GET一般是从服务器中获取数据。POST有可能改变数据

4.安全性:GET的请求信息可以被缓存,收藏,而且信息是明文。POST请求的信息不会被保存,更加安全。

5.GET只允许ASCII字符,POST对数据类型没有要求,二进制也可以。这就是为什么GET请求的时候有时候会出现乱码,当然POST请求也可能会出现。

6.GET的请求长度有限制,被浏览器或者系统限制,我记得谷歌是512K,具体大家百度下。而POST大小没有限制

搞清楚了上面这些问题后,那么HTTP1.0、HTTP1.1有什么区别呢?

1.长连接:HTTP1.0需要采用keep-alive参数来告知server建立一个长连接,而HTTP1.1默认是长连接。HTTP是基于TCP的应用连接,如果每次通讯都需要连接的话,那性能消耗太大了,因此最好建立一个长连接。

2.节约带宽:HTTP1.1支持只发送header信息(不需要带任何请求体),如果server认为client可以请求数据,则返回100,否则返回401。客户端如果收到100才把请求体发送给server。这样当服务器返回401时,client就可以不用发送请求体了,节约了带宽。另外,HTTP还支持传送内容的一部分。这样当client已经有了一部分的资源后,只需要跟server请求剩余的资源了。这是断点续传的基础。

3.host域:HTTP1.1的场景下,web server如tomcat是支持多个虚拟站点可以共享同一个ip和端口的。

HTTP1.1和HTTP2.0有什么区别呢

1.多路复用:即一个连接处理并发请求多次,以前是1个请求1个线程阻塞的,多路复用会用select阻塞多个线程,然后轮询这些线程IO,如果数据一旦准备好后,线程就会真正的IO操作(此时数据已经在内核了,用户线程直接拷贝就可以)。期间如果数据没有准备好,用户线程可以干其他事情。当然HTTP1.1也可以多建立几个TCP连接,但是多个连接还是得消耗一定的资源。而且建立TCP后会有个慢启动的过程。

2.数据压缩:HTTP1.1不支持header数据区域的压缩,2.0使用HPACK算法进行压缩,传输速度更快

3.服务器推送:意思是说客户端请求server后,server会把一些相关的客户需要的数据也一并传输过去,免得客户端再次建立连接请求server。比如一些静态文件,这种方式就非常适合。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值