最近被人问到了一些关于Socket与Http方面的问题,其实就关于Socket,我自己了解的也不是非常多,毕竟大学没有好好学习,所以很多东西都是我最近才看,然后速成了一些,看到了网上一些资料,现自己做个总结,如有不对,欢迎指正,共同学习。
HTTP:超文本传输协议,首先它是一个协议,并且是基于TCP/IP协议基础之上的应用层协议。即HTTP协议在网络层使用IP协议,在传输层使用TCP协议。IP协议主要解决网络路由和寻址的问题,而TCP协议则是解决如何在IP层之上可靠地传递数据包,使在网络的另一段收到发出端发送的所有的包,并且顺序与发出端顺序一样。HTTP协议详细规定了浏览器与服务器之间相互通信的规则,是万维网交换信息的基础。HTTP是基于请求-响应形式并且是“短连接”,并且是无状态的协议。针对其无状态特性,在实际应用中又需要有状态的形式,因此一般会通过session/cookie技术来解决此问题。
Socket:Socket不属于协议范畴,而是一个调用接口(API),Socket是对TCP/IP协议的封装,通过调用Socket,才能使用TCP/IP协议。Socket连接是长连接,理论上客户端和服务器端一旦建立连接将不会主动断开此连接。Socket连接属于请求-响应形式,服务端可主动将消息推送给客户端。
下面一段话形容Socket与HTTP的关系
“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如
果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也 可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
什么是Socket?
Socket中文又叫套接字,它是通信的基石,是支持TCP/IP协议的网络通信的基本单元。它是网络通信过程中端点的抽象表示,也就是说,Socket是对TCP/IP协议的一个封装,它本身并不是一个协议,它只是通过封装TCP/IP协议然后给我们提供了可供我们网络开发使用的一个API。网上有这么一句话我觉得写的非常好。
“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”
Socket包含进行网络通信的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
当应用层通过传输层进行数据通信时,TCP会遇到同时为多个程序进程提供并发服务的问题。多个TCP链接或多个应用程序进程可能需要通过一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口来区分不同的应用程序进程或者网络连接的通信,实现数据传输的并发服务。
关于Socket的链接,总共分为三个步骤:服务器监听,客户端请求,连接确认。
1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
3。连接确认:当服 务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端
确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
这三个步骤没有什么好解释的,无非大体上就是说,服务器端提供一个一直处在监听状态的套接字,然后客户端的套接字确定要连接到服务器上哪个套接字,然后向服务器端的套接字进行请求,当服务器端的套接字接收到了客户端套接字的时候,服务端这边就会另起一个新的线程,让两者连接。
所以总体来说,Socket实际上是对TCP/IP的一个封装,封装了之后,在我们再进行网络开发的时候我们就可以很方便的直接调用API来进行TCP/IP协议的调用了。
那么HTTP又是什么呢?
众所周知,http,超文本传输协议,它是Web联网的基础,也是手机联网的常用协议之一,HTTP协议,是建立在TCP协议之上的一种协议,它属于应用层协议,主要就是进行如何包装数据。它是一种“短连接”。关于HTTP的“短连接”,起初我是纠结了好久,因为HTTP本身的协议就是基于TCP的,而TCP通过三次握手建立的不应该是一个长连接么,怎么就会变成“短连接”了呢?在搜寻了相关资料之后,我才慢慢逐渐理解了一些,其实关于HTTP的“短连接”,实际上是指,当Client向Server发送一个请求的时候,双方采用三次握手(即:Client:你在么?Server:我在。Client:我连接了)建立起链接,然后当Client和Server完成一次读写操作(即Client请求,Server相应了Client)后,此时双方都可以关闭的操作,一般由客户端收到相应后提出断开,然后双方进行四次挥手断开。这就是所谓的HTTP“短连接”,不是说他不能长,只是他自己就非要段。
采用这种TCP短连接的好处:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。
那么既然说到了“短连接”,那么就再说一下长连接:Client向Server发起链接,Server接收Client的连接,同样,三次握手后,双方建立连接,但此时,当Client和Server完成一次读写后,它们之间的连接并不会主动关闭,后续的操作会继续使用这个连接。
首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务 器端检测到这种半开放的连接。
如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:
- 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
- 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
- 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
- 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。
关于到底长连接好还是短连接好,这个只能看情况而定
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可
以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。
再补充一点关于TCP与UDP的不同:
•UDP(用户数据报协议)
–将数据及源和目的封装成数据包中,不需要建立连接
–每个数据报的大小限制在64K之内
–因为无需连接,因此是不可靠协议
–不需要建立连接,速度快
•TCP(传输控制协议)
–建立连接,形成传输数据的通道
–在连接中进行大数据传输(数据大小不收限制)
–通过三次握手完成连接,是可靠协议,安全送达
–必须建立连接,效率会稍低