zoukankan      html  css  js  c++  java
  • http中的socket是怎么一回事

      首先我们先看一下socket的定义:是在传输层和应用层中间的一个抽象层,是实现网络通信的接口。

      那么什么是传输层,什么是应用层呢?网络又是怎样通信的呢?为了弄清这两个问题,我们需要弄清一个概念TCP/IP四层模型和OSI七层模型。

      

             

      OSI: Open System Interconnection的缩写,意为开放式系统互联。

      TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何在它们之间传输的标准。

      OSI七层模型是TCP四层模型的延申拓展,我们就简单了解一下这七层究竟是什么定义,每层负责什么。如果对这方面有兴趣的极客,可以google一下具体的详细资料。

      1.物理层:机械,电子,一些定时接口的比特流传输。

      2.数据链路层:实现物理寻址,将比特流实现按逻辑电路传输。

      3.网络层:控制子网的运行,路由的选择,将信号发送到哪里。

      4.传输层:接受下一层会话层的数据,有必要时对数据进行分割,传给网络层传输。

      5.会话层:不同机器上的客户建立会话通信。

      6.表示层:信息语法语义以及他们的关联,比如压缩,加密。

      7.应用层:各种应用程序协议,比如HTTP FTP SMTP。

      那么通过以上简单介绍,大家应该对数据传输的有了个简单初步认识。我们都知道每台接入互联网的计算机都只有唯一的IP域名,我们使用的所有网络程序,比如QQ,LOL等,要进行数据的交流,必须要与相同的域名进行连接,那么这么多进程怎么才能区分这个网络信息是给我自己的进程的呢?所以每个进程都要绑定端口号,通过IP+端口可以唯一确定信息交流的准确性。socket完成的就是这个任务,每个网络程序调用自身的socket来监听端口,完成信息交流传输,而且信息的交流还要依赖于TCP/IP协议。那么我们再深入了解一下TCP/IP协议,有助于我们深入了解数据间的传输。

      1.客户端和服务端的交流,首先依赖于套接字(也是socket,英文翻译是插座,比较形象,类似于电器和电站之间的连接形式),可以理解为一条管道,所以我们的计算机可能有很多管道同时在工作,管道的终点就是服务端创建的套接字,首先客户端先创建一个套接字,会返回一个描述符,描述符的作用是客户端判断进行交流的网络信息应该走哪条管道,但是这个描述符只有计算机自己知道,服务端并不知道,所以它不能代替端口,作用可以理解为建立好这个端口。

      2.管道建立好之后,就是数据的传输,网络中的数据,并不是源源不断连续的,而是以一个个包的形式来传递,正式因为传递和处理速度之快,你感觉不到他的断断续续。遵循TCP形式的包的统一格式是这样的

    简述一下作用:

      报头:一串0101……规则序列。服务端读取时,知道是一个稳定的数据包,他的信息马上要来了。

      起始帧分界符:尾数为11。服务端以此作为数据包的起点。

      FCS:它是一串 32 比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的,受到干扰时值会改变,一旦接收方计算的和发送方不一样时就说明此包失真。

      MAC头部 :包含了发送方和接收方的MAC地址,MAC地址位于计算机网卡的ROM中,全世界独一无二,跟指纹一样。

       IP头部:包含了发送方和接收方的IP信息。

      TCP头部:除了发送方端口号,接收方端口号之外,还有如下重要字段:

        序号,ACK号:这两者作用是确保包没有遗漏,如有,会自动补发。

        控制位:1.ACK:(与上方ACK不同)告知数据已接收。

            2.SYN:发送方和接收方互相确认的信号,表示已连接。

            3.FYN:表示断开连接。

    有了以上概念,我们来看一下TCP三次握手:(seq表示序号)

    第一次握手:客户端SYN=1请求连接,序号=J(标记值,无实际意义,用来确定发送了多少信息),

    第二次握手:服务端SYN=1请求连接,ACK=1(已经接收到客户端的连接请求),ack=J+1(已收到你发的J单位信息,请确认你没有漏发),seq=K(标记值无意义,用来确定收到了多少单位信息)

    第三次握手:客户端ACK=1(已经接收到服务端的连接请求),ACK=K+1(收到了你发的K大小单位信息,请确认你没有漏发)

    TCP四次挥手:

    第一次挥手:客户端FIN = M请求断开

    第二次挥手:服务端ack=M+1(已收到M单位大小信息,请确认你没有漏发)

    第二次挥手:服务端FIN = N请求断开

    第四次挥手:客户端ACK=1(确认断开) ack=N+1(已经收到你的N单位信息,请确认你没有漏发)

    总结:socket是网络传输必要的标识符,它的作用是建立一个发送方接收方之间的管道,通过socket库中的一些命令recv ,send等来完成收发信息的操作。是TCP传输协议的必要条件之一。相信你已经对文章开头:socket是在传输层和应用层中间的一个抽象层,是实现网络通信的接口。有了更加充分的认识吧。

  • 相关阅读:
    最详细的cookie和浏览隐私之间的关系
    图的广度优先搜索(BFS)
    web前端基础知识总结
    关于在BAE上部署ThinkPHP框架的问题
    PHP中AJAX的使用(完整实例【大牛可飘过】)
    无缝滚动
    平常项目中用到的分享到侧边栏
    IDEA Spark Streaming 操作(套接字流)
    IDEA Spark Streaming 操作(文件源)
    Spark 操作Hive 流程
  • 原文地址:https://www.cnblogs.com/jimmyhe/p/10291283.html
Copyright © 2011-2022 走看看