浅析socket短连接和长连接

概述:

         http和socket,这两个词在编程中,相信大家不陌生,说到网络编程,下载文件,大家很快就想到了这些名词,使用也很简单。但是http和socket内部机制是怎样的呢,http和socket有什么联系和区别呢。相信大家对这些机制理解就比较模糊了,今天这篇文章主要讲述http网络访问方式和socket访问方式的区别,以及他们内部的原理,涉及到TCP/IP协议栈中的相关概念。


首先我们来看一张图:

  


上图是TCP/IP协议栈结构,虽然网络课上我们学的是osi七层模型,在市场上,实际的规范协议栈为TCP/IP,两者很类似。图中的协议栈,应用层是我们开发中常用到的协议,比若说http,http是我们今天关注的重点协议,它基于传输层的TCP通信,其他基于TCP通信的协议类似。大家可以查阅相关资料。


Http:


Http是基于传输层TCP协议的应用层协议,也是使用最广的协议之一,通信端口为80,我们通过一次浏览器请求网页的过程来分析http的工作过程。

在浏览器中输入网站url后,第一步是解析URL,基于DNS协议,这个过程不是我们关注的重点,大家有兴趣可以查阅计算机网络的相关资料,解析URL获得服务器的IP地址后,通过TCP建立和服务器的连接,下面我们分析TCP建立连接的过程。

TCP分三次握手实现连接建立:

1, 首先客户端发起连接请求,带上SYN = 1, seq = x

2,服务器收到客户端请求后,SYN = 1, ACK = 1, seq = y, ack = x + 1 ,将该数据包发送到客户端。

3,客户端收到服务器的回应后,会认为客户端到服务器,以及服务器到客户端的连接已经建立,但是此时,服务器并不知道它给客户端的回应,客户端是否收到,所以,需要客户端再发送一个数据包到服务端,ACK = 1, seq = x + 1, ack = y + 1


这里一定要注意,第三步不能省去,否则服务端不知道它发送到客户端的回应消息是否成功到达客户端。


连接过程如下图所示


TCP连接建立以后,开始请求网络服务器的文档。在http1.0中,协议是无状态的,这就意味着,每次请求一个一个资源就要建立一次连接,需要两个RTT时间(RTT为一次交互的往返时间),对于一个有很多超链接的网页来说,效率十分低下。在http1.1中,改进了这个问题,浏览器和服务器建立连接后,会将这条连接保持一段时间,浏览器可以利用这条连接访问该web服务器上的其他资源,同时,http访问的方式是基于流水线,并非简单的串行访问,这样更提高了访问效率。下面的这张图展示了http请求一个文档的整个过程。




http在请求完网络文档后,并不会将TCP连接保持下去,而是将其释放,TCP连接过程采用三次握手,那么释放又是怎样操作的呢。




关闭TCP连接分为被动关闭和主动关闭。客户端需要关闭连接时,首先会发送一个数据包,FIN = 1 seq = u,其中,u是当前客户端已经传送过了的数据的序号+1,这时候,客户端进入停止等待的状态,等待服务器确认,服务器收到客户端关闭TCP连接请求后,发送ACK = 1,代表确认,ack = u + 1, 同时发出自己的序号v,其中v等于前面已经传送过的数据的序号+1,至此,客户端到服务器端的连接已经关闭,我们成这种状态为半关闭状态,服务器仍然可以往客户端发送数据。如果服务器仍然需要向客户端发送数据的话,这个状态将保持一段时间。


当服务器不再需要往客户端发送数据时,服务器发出关闭连接请求,发送FIN = 1, ACK = 1 seq = w, ack = u + 1,客户端收到服务器要求关闭TCP的数据报文之后,回送ACK = 1, ack = w + 1, seq = u + 1;客户端在发出这段数据后,会等待一段时间,最后关闭连接。

为什么客户端再发出确认后,为什么要等待一段时间呢?

防止服务器端未收到确认而无法正常关闭,服务器在发出断开连接的请求后,会等待客户端的回应,如果在规定时间内没有收到回应,就会认为客户端没有收到断开连接的请求,这时候,会重复该请求,客户端通过等待一段时间,可以保证服务端顺利关闭。




Socket

socket是什么东西呢,简单一句话,socket其实就是一套API,封装了TCP/IP协议栈的操作,通过socket提供的API,可以利用协议栈中的协议进行网络通信,就这么简单。http是基于TCP通信的,但是socket封装得协议不仅限于TCP,UDP,还可以有IP,ARP等。为我们通信提供了更高的灵活性。我们经常提到socket长连接,http短连接,这种描述是有问题的,socket可以实现长连接(建立连接后,不主动释放),可以实现短连接,更准确的说,应该是TCP长连接,TCP短连接。所以我们这里可以得出一个结论,socket和http,其实没啥关系,两者是不同的两个概念。平时在Java开发中,利用http进行通信,其实质是Java按照http标准要求,通过调用socket api实现网络通信,最终http模块将这些功能以接口的形势提供出来。如果你愿意,你可以自己通过socket方式,实现http通信过程。


关于JAVA socket


JAVA语言提供了socket通信方式,究其本质而言,也是通过JNI调用OS的socket api接口实现相关功能,大家对这个东西要能理解。至于用法,很简单,这里就不再赘述。


参考资料:

计算机网络第五版(谢希仁)

TCP/IP 详解


PS: 文章如有错误,欢迎大家指出,共同进步~



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值