美文网首页我爱编程
对TCP/IP、Http、Socket的理解

对TCP/IP、Http、Socket的理解

作者: Jey | 来源:发表于2018-04-12 19:22 被阅读50次
    网络分层

    物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。


    8718367adab44aedb14be429b21c8701a08bfbf2.jpg

    TCP协议对应于传输层,主要解决数据如何在网络中传输。
    HTTP协议是基于TCP协议的,它对应于应用层,主要解决包装数据和解析。
    socket则是对TCP/IP协议的封装和应用,是从传输层上抽象出来的,采用IP地址加上端口号的形式来标识,并不是真正意义上的网络协议。

    TCP连接的三次握手

    第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
      第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
      第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    1. HTTP连接
      HTTP协议是基于TCP协议的,客户端向服务器发起http请求的时候,就需要实现与服务器的TCP连接,三次握手,当请求完数据后,会立即断开连接。所以Http连接是一种响应式无状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

    2. socket
      socket是从传输层上抽象出来的,它是一套接口,所以Socket连接可以基于TCP连接,也有可能基于UDP。

    Socket 连接,至少需要一对套接字,分为 clientSocket,serverSocket 连接分为3个步骤:

    (1) 服务器监听:服务器并不定位具体客户端的套接字,而是时刻处于监听状态;

    (2) 客户端请求:客户端的套接字要描述它要连接的服务器的套接字,提供地址和端口号,然后向服务器套接字提出连接请求;

    (3) 连接确认:当服务器套接字收到客户端套接字发来的请求后,就响应客户端套接字的请求,并建立一个新的线程,把服务器端的套接字的描述发给客户端。一旦客户端确认了此描述,就正式建立连接。而服务器套接字继续处于监听状态,继续接收其他客户端套接字的连接请求.

    TCP/UDP的区别:

    1、TCP是面向连接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上保证了连接的可靠性;
    UDP广播式数据传输,不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,所以说UDP是无连接的、不可靠的一种数据传输协议。
    2、使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

    socket与HTTP的区别

    socket
    优点:1.传输数据为字节级,传输数据可自定义,数据量小。
    2.传输数据时间短,性能高
    4.可以加密,数据安全性高
    缺点: 1.需要对传输的数据进行解析,转化为应用级的数据

    HTTP
    优点:1.基于应用级的接口使用方便
    2.要求的开发水平不高,容错性强
    缺点: 1.传输速度慢,数据包大。
    2.如实现实时交互,服务器性能压力大
    3.数据传输安全性差

    实际场景用例:
    1. 通过socket连接通讯,socket转发消息实现客户端和服务器端的数据交互。客户端启动的时候可以先http发送请求,拿到某些数据(ip或者端口号),再去连接socket,后台的话既有socket,也有http通讯,这样就可以不用一直发送http请求,数据可以直接走socket通讯方式,再有socket转发到php后台,提交数据传输的效率。

    2. socket粘包问题:参考https://www.cnblogs.com/QG-whz/p/5537447.html
      多个独立的数据包连在一起一次性发给了客户端,比如1.aaaa 2. bbbb,两条数据,客户端收到的是aaaabbbb,这时候就懵逼了。
      原因:
      在客户端/服务器端都会有一个比较大的数据缓冲区,来存放接收的数据,为了保证能够完整的接收到数据,因此缓冲区都会设置的比较大,发送端需要等缓冲区满才发送出去,造成粘包。
      解决方法:
      (1). 在发送/接收消息时,将消息的长度作为消息的一部分发送出去,从而接收方可以根据传来的长度信息,制定相应长度的缓冲区。
      (2). 将发送的消息的首尾都加上特殊标记符。

    注:一条数据可以包头(加盐处理的某些字符串)+包体长达+CMD+包体内容

    1. 增加备用网络连接路线。当某些ip遭受恶意攻击或者出现网络波动的情况下,尝试连接其他Ip路线。

    相关文章

      网友评论

        本文标题:对TCP/IP、Http、Socket的理解

        本文链接:https://www.haomeiwen.com/subject/ehgxkftx.html