ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

套接字Socket

2021-09-08 21:30:38  阅读:131  来源: 互联网

标签:socket 连接 描述符 接字 监听 服务端 Socket


套接字Socket

客户端和服务端进行通信之前,双方都要建立一个Socket

Socket 编程进行的是端到端的通信,往往意识不到中间经过多少局域网,多少路由器,因而能够设置的参数,也只能是端到端协议之上网络层和传输层的。

Socket设置的参数:

  • 网络层:
    • IPV4:AF_INET
    • IPV6:AF_INET6
  • 传输层:
    • TCP:SOCK_STREAM
    • UDP:SOCK_DGRAM

基于 TCP 协议的 Socket 程序函数调用过程:

  • 服务端

    1. 要先监听一个端口,一般是先调用 bind 函数,给这个 Socket 赋予一个 IP 地址和端口。

      • 端口号作用:写的是一个应用程序,当一个网络包来的时候,内核要通过 TCP 头里面的这个端口,来找到你这个应用程序,把包给你。
      • IP地址作用:一台机器会有多个网卡会有多个 IP 地址,你可以选择监听所有的网卡或一个网卡,这样,只有发给这个网卡的包,才会给你。
        • 0.0.0.0 监听所有网卡
    2. 当服务端有了 IP 和端口号,就可以调用 listen 函数进行监听。

      • 主动发起的是客户端,被动连接的是服务端,所以服务端先开启端口,监听是否有消息过来。
      • 在 TCP 的状态图里面,有一个 listen 状态,当调用这个函数之后,服务端就进入了这个状态,这个时候客户端就可以发起连接了。
    3. 在内核中,为每个 Socket 维护两个队列。

      • 一个是已经建立了连接的队列,这时候连接三次握手已经完毕,处于 established 状态;
      • 一个是还没有完全建立连接的队列,这个时候三次握手还没完成,处于 syn_rcvd 的状态。
    4. 接下来,服务端调用 accept 函数,拿出一个已经完成的连接进行处理。

      • 如果还没有完成,就要等着。
      • 服务端调用accept函数,从已经连接的队列中取出一个连接,如果m队列为空,则阻塞
        • 在服务端等待的时候,客户端可以通过 connect 函数发起连接。先在参数中指明要连接的 IP 地址和端口号,然后开始发起三次握手。
        • 内核会给客户端分配一个临时的端口。一旦握手成功,服务端的 accept 就会返回另一个 Socket。
          • 这里临时窗口的作用是,在三次握手的过程中,作为服务端应答包中的源端口。
          • 这是一个经常考的知识点,就是监听的 Socket 和真正用来传数据的 Socket 是两个,一个叫作监听 Socket,一个叫作已连接 Socket
          • 监听socket是socket函数创建的,已连接socket是accpet函数返回的,此socket代表网络中的点点连接,所以用这个socket进行通信,而监听socket在整个服务生命周期内只有这一个。 为什么需要两个socket? 如果使用一个socket的话,那么它的功能太多,使得使用很不直观,同时在内核确实产生了一个这样的新的socket描述字。
    5. 连接建立成功之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样。

      • 每一个进程都有一个数据结构 task_struct,里面指向一个文件描述符数组,来列出这个进程打开的所有文件的文件描述符。

      • Socket 在 Linux 中就是以文件的形式存在的。除此之外,还存在文件描述符。写入和读出,也是通过文件描述符。

      • 文件描述符本质是数组的下标

    6. Socket 在 Linux 中就是以文件的形式存在的。除此之外,还存在文件描述符。写入和读出,也是通过文件描述符。

基于 UDP 协议的 Socket 程序函数调用过程

  1. 对于 UDP 来讲,过程有些不一样。UDP 是没有连接的,所以不需要三次握手,也就不需要调用 listen 和 connect,但是,UDP 的交互仍然需要 IP 和端口号,因而也需要 bind。

  2. UDP 是没有维护连接状态的,因而不需要每对连接建立一组 Socket,而是只要有一个 Socket,就能够和多个客户端通信。也正是因为没有连接状态,每次通信的时候,都调用 sendto 和 recvfrom,都可以传入 IP 地址和端口。

标签:socket,连接,描述符,接字,监听,服务端,Socket
来源: https://blog.csdn.net/qq_41890651/article/details/120189140

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有