HTTP、TCP、Socket区别与联系

    TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据,两者本质上没有可比性,何况HTTP协议是基于TCP连接的。而Socket 是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

    关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”

    TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP。

    1、先说Socket连接与TCP连接:

    应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。这也就是我们在保持长连接时需要间隔一段时间发送一个心跳包的原因。

    2、再说Socket连接与HTTP连接:

    Socket一般作为长连接使用,而HTTP一般作为短连接使用,下面我们先了解一下长连接与短连接

    短连接 
      连接->传输数据->关闭连接 
      HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 
      也可以这样说:短连接是指 Socket 连接后发送后接收完数据后马上断开连接。 

    长连接 
      连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。 
      长连接指建立 Socket 连接后不管是否使用都保持连接,但安全性较差。 

    HTTP 一般应用在短连接,但HTTP 1.1中,HTTP也能支持长连接,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。

那我们什么时候用长连接,什么时候用短连接? 

    长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成Socket错误,而且频繁的Socket创建也是对资源的浪费。 
    而像WEB网站的HTTP服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接 会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下 需用短连好。

    3、下面分别介绍一下HTTP、TCP、Socket基本概念

    (1)HTTP连接

   HTTP协议即超文本传送协议,是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

  HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

  1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。

  2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

  由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”。要使用HTTP长连接保持客户端程序的在线状态,需要不断地向服务器发起连接请求,客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间。通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

   (2)Socket

  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。套接字(Socket)概念

  套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

  而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给 客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

   (3)TCP

    TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议TCP的连接建立需要经过三次握手,而连接终止需要四次握手。

    TCP连接建立三次握手

  所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

  第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的序列号加1以,即X+1。

第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。

HTTP、TCP、Socket区别与联系_第1张图片

    三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

    TCP连接终止四次挥手

  TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket

  编程中,任何一方执行close()操作即可产生挥手操作。

为什么连接的时候是三次握手,关闭的时候却是四次挥手?

某个应用进程首先调用close,驻东莞比长连接时,该端的TCP于是发送一个FIN报文,表示数据发送完毕,可以关闭连接,接收到这个FIN的对端执行 “被动关闭”,可是此时这一方可能还有没有处理完成的任务,比如从输出流中读取传送过来的数据,所以并不会立即关闭SOCKET连接,所以只能先回复一个ACK报文,告诉请求关闭连接端,你发的FIN报文我收到了。只有等到我所有的处理完之后,我才发送FIN报文,告诉说连接可以关闭,最后请求关闭端在发送一个ACK报文同一关闭连接。故需要四步握手。

HTTP、TCP、Socket区别与联系_第2张图片

你可能感兴趣的:(http,网络,tcp,socket)