Http,Socket,Tcp,Udp,Ip原理区别

3,749 阅读6分钟

TCP,UDP,IP

TCP是传输层的协议,UDP也是传输层的协议,IP是网络层的协议。

IP:是用来找到目标计算机。如A向B发送数据,那么要找到对方B的计算机,找到后就确定了网络间的通道,A - B。也就是说IP是来确定网络间的路径的。

TCP:是用来实现通信的,它是一个全双工的协议(后面会说明)。在IP实现了网络间路径后,TCP提供了这个路径的全双工通信的能力。这个链接的建立要经历三次握手,断开链接要四次挥手(后面会说明)。

UDP: 是和TCP相似的,也是提供了通信能力。不过和TCP有区别。TCP是点对点的通讯,UDP支持一对多,多对一,一对一等。UDP不需要链接,直接发数据,相对来说速度更快,但是不保证数据一定会到达,适合广播。

全双工半双工与单工

全双工: 表示A可以给B发送数据的同时,B也可以给A发送数据。

半双工:表示A给B发送数据的时候,B不能给A发送数据。当B给A发送数据的时候,A不能给B发送数据。

单工: 表示要么是A只可以给B发送数据,或者B只能给A发送数据。数据是单向发送的不是双向的。

TCP三次握手

TCP建立连接需要三次握手,断开链接需要四次挥手。以下例子中A为客户端,B为服务器,来说明三次握手与四次挥手过程。

注意:TCP是一个全双工的协议,所以下边建立连接时候SYN=1发送两遍,A要向B建立连接发送SYN=1。B也要向A建立连接也要发送SYN=1。同理四次挥手时候也要发送两遍FIN=1。

第一次握手: 客户端A发送SYN=1(代表要向B建立连接),seq=a(A发送数据的一个序列号)到服务器。
第二次握手:服务器B收到数据后,向客户端A发送ACK=1(代表应答收到),SYN=1(代表要向A建立连接),seq=b(B发送数据的一个序列号),ack=a+1(等于收到数据时候的seq+1,代表确认码)。

第三次握手:客户端A收到数据后先看下ack是不是上次发的seq+1=a+1。确保没问题后会向服务器B发送ACK=1(代表应答收到),seq=a+1(A发送数据的下一个序列号),ack=b+1(等于收到数据时候的seq+1,代表确认码)。

在这里插入图片描述

TCP四次挥手

第一次挥手: 客户端A向服务器B发送FIN=1(A请求断开服务器连接),seq=a(本次数据序列号)。

第二次挥手:服务器B向客户端A发送ACK=1(应答,收到数据)seq=a+1(代表还有数据没发送)。

第三次挥手:服务器向客户端A发送FIN=1(服务器要断开A的链接),seq=b(本次数据的序列号),ack=a+1(确认码,代表没有数据要发送了)。

第四次挥手:客户端A验证收到的ack是不是等于a+1,确保B没有数据在发送了。然后发送给服务器B,ACK(应答),seq=a+1(本次数据序列号)。

在这里插入图片描述

Http

http是应用层的协议,它实现了怎么发数据和怎么收数据,定义了收发的格式,同时定义了是短连接。当一次传输数据结束就断开链接。

特点

  1. 只能客户端主动发出请求,服务器被动响应。服务器没办法主动给客户端发数据。
  2. http1.0是个短连接,当一次链接数据传送完毕后,就会断开链接。
  3. http1.1前端和后台可以配置成长链接,默认60s,当一次链接成功,发送完一次数据后,60s内如果前端再一次请求数据那么将复用上一次tcp通道,并且倒计时重新刷新。当60s结束后客户端没进行请求数据,这时候tcp就会断开链接。这个倒计时时间是支持设置的。

请求

  1. 请求行
    说明了是get方法,还是post方法等等,说明了协议版本http 1.1等,get方法会有URL。这里get方法参数往往要求ASCII码,也就是不能有中文,并且还有长度限制,post没有。其实这里往往是浏览器等作出的限制,而不是post的请求行中就不能放参数。

  2. 请求头
    包含了User-Agent:浏览器类型,请求数据的来源。 Accept:可以接收的数据类型,这里要和服务器的Content-Type匹配。服务器发送的类型和客户端可以接收的类型要一致。 Accept-Encoding,Accept-Language等等。 Content-Type:发送内容的类型,往往post方法才会有,因为post方法的参数是在请求体里。 请求头部也可以自己添加新字段,比如常见的添加token,userId等。

  3. 空行

  4. 请求体
    一般只有post方法请求体中才会有数据。

响应

  1. 状态行
    包含协议以及协议的版本,状态码。
    1.xxx: 刚开始接收到数据。
    2.xxx: 已经接收到数据,可以解析数据。
    3.xxx: 重定向。
    4.xxx: 客户端的错误。
    5.xxx: 服务端错误。
    这些都是http的状态码,其实还要后台自己定义的错误码,和这里的状态码不一样。

  2. 响应报头
    Date: 接收到请求的日期时间。
    Content-Type: 响应的数据类型。
    Content-Length: 响应数据的内容长度。

  3. 空行

  4. 响应报文
    常见的是返回了html网页内容,或者返回了json数据。

Http请求过程

  1. 首先客户端发送http请求连接服务器,tcp协议三次握手建立连接。
  2. 客户端开始发送请求数据,服务器例如java会在线程池里拿出来一个线程来接收这次http的请求。
  3. 服务器拿到请求后进行资源查找,之后会返回数据给客户端,这个过程就是相应。
  4. 客户端拿到服务器返回的数据后保存处理,进行四次挥手断开http链接。 这时候java的那个处理请求的线程将会放回java线程池,等待下次请求。

socket

socket是套接字,是对TCP/IP的封装。它对数据传输的两者提供了一个全双工的管道。
它和http一样,传输数据前要经历三次握手链接也要经历四次挥手断开链接。和http协议的区别在于,socket是一个长链接。http是短连接。socket虽然是长链接,但是由于网络等原因也有可能会断开链接。所以往往会提供一个心跳包,每隔一段时间向服务器发送一个规定好的心跳,如果某一个时间发送没有收到心跳,那代表已经断开链接了。

HTTP长连接和Socket区别

  1. http1.1长连接是为了多次请求服务器可以复用tcp通道,这样就省去了销毁tcp和再次创建tcp通道的时间。
  2. socket目的是为了客户端和服务器之间形成管道,保持两者都可以相互通讯。
  3. http1.1这种长连接在一定程度上提高了请求速度,但是又有别于socket。设计初衷是不一样的。