网络篇N+2 :http 、TCP /IP 、Socket 、UDP总结

HTTP

  1. HTTP与TCP/IP
    1. TCP/IP协议是传输层协议,主要解决数据如何在网络中传输
    2. 而HTTP是应用层协议,主要解决如何包装数据。
  2. HTTP链接的特点
    1. HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
    2. HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
  3. HTTP版本简介
    1. HTTP 1.1之前
      1. 不支持持久连接。一旦服务器对客户端发出响应就立即断开TCP连接
      2. 无请求头跟响应头
      3. 客户端的前后请求是同步的。下一个请求必须等上一个请求从服务端拿到响应后才能发出,有点类似多线程的同步机制。
    2. HTTP 1.1(主流版本) 与1.1之前的版本相比,做了以下性能上的提升
      1. 增加请求头跟响应头
      2. 支持持久连接。客户端通过请求头中指定Connectionkeep-alive告知服务端不要在完成响应后立即释放连接。HTTP是基于TCP的,在HTTP 1.1中一次TCP连接可以处理多次HTTP请求
      3. 客户端不同请求之间是异步的。下一个请求不必等到上一个请求回来后再发出,而可以连续发出请求,有点类似多线程的异步处理。
    3. HTTP 2.0本着向下兼容的原则,
      1. 1.1版本有的特性2.0都具备,也使用相同的API。但是2.0将只用于https网址。
    4. 支持持久连接有什么好处呢?
      1. HTTP是基于TCP连接的,如果连接被频繁地启动然后断开就会花费很多资源在TCP三次握手以及四次挥手上,效率低下。以请求一个网页为例,我们知道,一个html网页上的图片资源并不是直接嵌入在网页上,而只是提供url,图片仍需要额外发HTTP 请求去下载。一个网页从请求到最终加载到本地往往需要经过多个HTTP请求。在1.1版本之前请求一个网页就需要发生多次”握手-挥手”的过程,每次连接之间相互独立;而1.1及之后的版本最少只需要一次就够。
      2. 请求异步,多线程异步处理

TCP相关

  1. 什么是TCP连接的三次握手?
    1. 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
    4. 注意:
      1. 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
      2. 理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去
      3. 断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”

Socket相关

  1. 什么是scoket ?
    1. socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)
    2. 通过Socket,我们才能使用TCP/IP协议
    3. Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,
    4. 从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。
  2. 利用Socket建立网络连接的步骤(这个更详细的参考前面的socket讲解)
    1. 建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
    2. 套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
      1. 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
      2. 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
      3. 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

HTTP、Socket、TCP的区别

  1. 总体区别
    1. HTTP是应用层的协议,更靠近用户端;TCP是传输层的协议;而socket是从传输层上抽象出来的一个抽象层,本质是接口。
  2. TCP连接与HTTP连接的区别
    1. HTTP是基于TCP的,客户端往服务端发送一个HTTP请求时第一步就是要建立与服务端的TCP连接,也就是先三次握手,“你好,你好,你好”。从HTTP 1.1开始支持持久连接,也就是一次TCP连接可以发送多次的HTTP请求。
    2. 总结: HTTP基于TCP
  3. TCP连接与Socket连接的区别
    1. socket层只是在TCP/UDP传输层上做的一个抽象接口层,因此一个socket连接可以基于TCP,也有可能基于UDP。基于TCP协议的socket连接同样需要通过三次握手建立连接,是可靠的;基于UDP协议的socket连接不需要建立连接的过程,不过对方能不能收到都会发送过去,是不可靠的,大多数的即时通讯IM都是后者。
    2. 总结: Socket也可以基于UDP
  4. HTTP连接与Socket连接的区别
    1. HTTP是短连接,Socket(基于TCP协议的)是长连接。尽管HTTP1.1开始支持持久连接,但仍无法保证始终连接。而Socket连接一旦建立TCP三次握手,除非一方主动断开,否则连接状态一直保持。
    2. HTTP连接服务端无法主动发消息,Socket连接双方请求的发送先后限制。这点就比较重要了,因为它将决定二者分别适合应用在什么场景下。HTTP采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方随时可以向另一方喊话。
  5. 什么时候该用HTTP,什么时候该用socket?
    1. 用HTTP的情况:双方不需要时刻保持连接在线,比如客户端资源的获取、文件上传等
    2. 用Socket的情况:大部分即时通讯应用(QQ、微信)、聊天室、苹果APNs等
    3. 在iOS中,发HTTP请求一般用原生的NSURLConnectionNSURLSession或者开源的AFNetWorking(推荐)、ASIHttpRequest(已停止更新)。连接Socket连接我用的比较多是robbiehanson大神的CocoaAsyncSocket (XMPPFramework 也是出自他手)。
Table of Contents