服务器和客户端的套接字通信

服务器和客户端的套接字通信

大家好,我是小学五年级在读的蒟蒻,专注于后端,一起见证蒟蒻的成长,您的评论与赞与关注是我的最大动力,如有错误还请不吝赐教,万分感谢。一起支持原创吧!纯手打有笔误还望谅解。

  • TCP/IP的四层参考模型,从上到下分别是:应用层,传输层,网络层,网络接口层。

    • 应用层协议:HTTP,FTP,DNS等

    • 传输层协议:TCP,UDP

    • 网络互连层协议:IP,ARP,RARP,ICMP

    • 网络接口层协议:Ethernet,ISDN等

  • 在TCP/IP四层参考模型中,从上往下有四种层次:应用层,传输层,网络层,网络接口层,应用层包括HTTP,FTP,DNS等协议,而传输层包括TCP,UDP两种协议,网络层则包含IP,ARP等协议,网络接口层较为底层。

  • 传输层的作用

    • 传输层的根本目的是在网络层提供的数据通信服务基础上,实现主机的进程间通信的可靠服务。

    • 有以下两个要点:位于两个主机内部的两个应用进程之间提供通信服务,提供可靠的通信服务

  • 套接字(socket)

    • 是一个套用C语言写成的应用程序开发库,实现进程间通信和网络编程

    • 套接字是一个抽象层,应用程序可以通过它发生和接收数据,可对其进行想对文件一样的打开,读写和关闭等操作。套接字允许应用程序与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合

  • 端口(port)

    • 在计算机中,端口大致有两种意思:一是物理意义上的端口,比如RJ45,集线器,交换机,路由器等

    • 二是逻辑意义上的端口,一般指TCP/IP协议中的端口,端口号的范围从0到65535,比如浏览网页的80端口,FTP服务的21端口

    • 在TCP中一般都是软件形式的端口,根据提供的服务不同,一般可分为两种

      • TCP端口

        • 特点

          • 面向连接的传输服务。打电话式,会话式通信

          • 面向字节流传输的通信(而UDP是面向报文通信)。字节管道,字节按序传输和到达

          • 全双工通信.一个应用进程可以同时接收和发送数据,捎带确认;通信双方都设置有发送和接收缓冲区,应用程序将要发送的数据字节提交给发送缓冲区,实际发送由TCP协议控制,接收方收到数据字节后将它接收放在缓冲区,等待高级应用程序读取

          • 可建立多个并发的TCP连接.如Web服务器可同时与多个用户程序建立连接会话.

          • 可靠传输服务.不丢失数据,保持数据有序,向上不重复提交数据(通过确认机制,拥塞控制等方式实现),想象一下ATM机转账应用就需要上述的可靠性

      • UCP端口

        • 特点

          • 无连接:在发送数据之前不需要建立连接,因此减少了开销和发送数据前的时间

          • 仅最大努力交付:即不保证可靠交付,因此主机不需要维持复杂的连接状态表

          • 面对报文的:UDP对于应用层传递下来的报文,既不合并,也不拆分,而是保留这些报文的编辑。UDP对于应用程序提交的报文,添加头部后就向下提交给网络层

          • 支持多对多的交互通信

        • 适用场景

          • 适用于少量(几百个字节)的数据

          • 对性能的要求高于数据完整的要求,如播放视频,P2P,DNS等

          • 需要”简短快捷 “的数据交换 简单的请求与应答报文交互,如在线游戏

          • 需要多播和广播的应用,源主机以恒定的速率发送报文,拥塞时允许丢弃部分报文,如本地广播,隧道VPN。

    • 端口分类

      • 熟知端口号:给每种服务器分配的确定的全局端口号,每个用户进程都知道的相应的服务器进程的熟知端口号,范围是0-1023,它是统一分配和控制的

      • 注册端口号:在IANA注册的端口号,数值范围为1024-49151

      • 临时端口号:客户端程序使用的零时端口号,它是运行在客户端上的TCP/IP软件随机选取的,范围在49152-65535

      • 平时网络编程,服务器一般使用注册端口号,而客户端的端口号则是系统随机分配的,即临时端口号

    • TCP报文图

      重点的标志位和意义

  • TCP的三次握手过程

    • TCP的连接包括连接建立,报文传输,连接释放三个阶段,其中连接建立的三次握手过程较为重要.

    • 建立三次握手的过程

      • 客户端准备发起一次TCP连接,首先向服务器发送第一个"SYN"报文(控制位SYN=1)

      • 服务器收到SYN报文后,如果同意建立连接,则向客户端发送第二个"SYN+ACK"报文(控制位 SYN=1,ACK=1),该报文表示对第一个SYN报文请求的确认

      • 接收到SYN+ACK报文后,客户端发送第三个ACK报文,表示对SYN+ACK报文的确认

  • 用C++进行TCP套接字网络编程

    • 网络编程中我们一般会使用C/S架构,即包含服务器端和客户端
  • TCP网络编程的服务器端

    • 服务器端一般先用socket创建一个套接字,然后用bind给这个套接字绑定地址(IP和端口号),然后调用listen把这个套接字设置为监听状态,随后调用accept函数从已完成连接队列中取出成功建立连接的套接字,以后就在这个新的套接字上调用spend,recv来发送数据,接收数据,最后调用close来断开连接释放资源即可

      过程

  • TCP网络编程的客户端

    • 与服务器不同,客户端并不需要bind绑定地址,因为端口号是系统自动分配的,而且客户端也不需要设置监听的套接字,因此也不需要listen.客户端在用socket创建套接字后直接调用connect向服务器发起连接即可,connect函数通知Linux内核完成TCP三次连接握手,最后将连接的结果作为返回值.成功建立连接后我们就可以调用send和recv来发送数据,接收数据,最后调用close来断开连接释放资源

      过程

  • 完整流程

    TCP网络编程的整体流程

  • TCP网络编程的相关数据结构

    • 地址结构:

      • sockaddr

        • 在头文件 #include 中定义

        • 缺陷:sa_data把目标地址和端口信息混在一起了

          struct sockaddr {
                       
               sa_family_t sin_family;//地址族
              char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息               
             }; 
          
      • sockaddr_in

        • 在头文件#include或#include中定义

        • 该结构体解决了sockaddr的缺陷,将port和addr分开存储在两个变量中

          struct sockaddr_in{
                     
              short int sin_family;//地址族
              unsigned short int sin_port;//端口号
              struct in_addr sin_addr;//ip地址
              unsigned char sin_zero[8];//不使用
          };
          

          该结构体中提到的另一个结构体in_addr定义如下,用来存放32位IP地址

          struct in_addr
          {
                     
              unsigned long s_addr;//32位IPv4地址
          }

你可能感兴趣的:(计算机网络,c++,websocket,网络协议,tcp/ip)