学习笔记第三十天

网络通信基础
1. 物理层面
  • 信息通路:包括有线(如光纤、铜缆)和无线(如5G、4G、星链)连接。
2. 软件/逻辑层面
  • 需要建立逻辑上的通信通路,涉及网络编程和协议。
网络编程与OSI模型
OSI七层模型
  1. 物理层:定义物理连接的特性,如电气和机械特性,传输比特流。
  2. 数据链路层:负责节点间数据的成帧、传输和错误控制,传输帧数据。
  3. 网络层(网际层):处理网络间的数据传输,如IP协议,传输数据包。
  4. 传输层:提供端到端的可靠数据传输服务,如TCP或不可靠的数据传输服务,如UDP。
  5. 会话层:管理和维护两个节点间的会话。
  6. 表示层:数据的表示、加密和压缩等。
  7. 应用层:提供网络应用服务,如HTTP、FTP、SMTP等。
TCP/IP模型
  • 实际应用中常用的是TCP/IP模型,包括四层:应用层、传输层、网络层、网络接口层(或数据链路层)。
操作系统角度
  • 用户层:应用层,程序员接触的地方。
  • 内核层:包括传输层、网络层、数据链路层、物理层,操作系统已经实现这些层次,如TCP/IP协议栈。
IP地址与端口号
  • IP地址:用于标识网络中的一台主机,通常为32位(IPv4)或128位(IPv6)整型数值,表示方式为点分十进制(IPv4)。
  • 端口号:用于标识主机中的一个具体进程,与IP地址结合构成进程的网络地址。
网络编程协议
TCP(传输控制协议)
  • 特点
    1. 面向连接:通信前需建立连接。
    2. 可靠传输:保证数据无误、无丢失、无失序、无重复。
    3. 面向字节流:传输数据时不区分应用层消息的边界。
  • 适用情况
    • 对传输质量要求高。
    • 传输大量数据。
    • QQ等即时通讯软件的登录管理等功能。
UDP(用户数据报协议)
  • 特点
    1. 不可靠:不保证数据可靠传输。
    2. 无连接:发送数据前无需建立连接。
    3. 数据报:每个UDP报文独立处理。
  • 适用情况
    • 发送小尺寸数据(如DNS查询)。
    • 实时性要求高或难以建立连接的场景(如无线网络)。
    • 广播/组播通信。
    • 即时通讯软件的点对点文本通讯、音视频通讯。
    • 流媒体传输等。
    • Socket 函数
      int socket(int domain, int type, int protocol);
    • 功能:程序向内核请求创建一个新的套接字描述符,用于网络通信。
    • 参数
      • domain:地址族,指定套接字通信的协议族。常见的值有 AF_INET(IPv4)和 AF_INET6(IPv6),以及 AF_UNIX 用于同一台机器上的进程间通信。
      • type:套接字类型。常见的值有 SOCK_STREAM(流式套接字,基于TCP),SOCK_DGRAM(数据报套接字,基于UDP),以及 SOCK_RAW(原始套接字,直接操作IP层)。
      • protocol:指定使用的协议。通常设置为0,让系统根据前两个参数自动选择协议。
    • 返回值:成功时返回一个新的套接字描述符,失败时返回-1,并设置相应的errno值。
    • Sendto 函数
      ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, 
      const struct sockaddr *dest_addr, socklen_t addrlen);
    • 功能:向指定的地址发送数据。适用于无连接的数据报套接字(如UDP)。
    • 参数
      • sockfd:套接字描述符。
      • buf:指向要发送数据的缓冲区。
      • len:发送数据的字节数。
      • flags:发送选项,通常设置为0。
      • dest_addr:指向目的地址的指针,包含IP地址和端口号。
      • addrlendest_addr参数的长度。
    • 返回值:成功时返回发送的字节数,失败时返回-1,并设置相应的errno值。
    • sockaddr_in 结构体
      struct sockaddr_in { 
      sa_family_t sin_family; /* AF_INET */ 
      in_port_t sin_port; /* 端口号,网络字节序 */ 
      struct in_addr sin_addr; /* IP地址 */ 
      }; 
      
      
      struct in_addr { 
      uint32_t s_addr; /* IP地址,网络字节序 */ 
      };

    • sockaddr_in 结构体用于表示IPv4地址和端口号。
    • sin_family 字段通常为 AF_INET
    • sin_port 字段是端口号,使用网络字节序(大端序)。
    • sin_addr 字段是一个 in_addr 结构体,表示IP地址,也使用网络字节序。
    • 字节序转换函数
    • 主机到网络(Host to Network)
      • htonl:32位主机字节序转换为网络字节序。
      • htons:16位主机字节序转换为网络字节序。
    • 网络到主机(Network to Host)
      • ntohl:32位网络字节序转换为主机字节序。
      • ntohs:16位网络字节序转换为主机字节序。
    • 字符串转换函数
    • 主机地址字符串到网络字节序
      • inet_addr:将点分十进制的IP地址字符串转换为网络字节序的IP地址。
    • 网络字节序IP地址到主机地址字符串
      • inet_ntoa:将网络字节序的IP地址转换为其点分十进制的字符串表示形式。注意,inet_ntoa 返回的是指向静态内存的指针,因此不适合在多线程环境中使用。
    • recvfrom 函数
      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
      struct sockaddr *src_addr, socklen_t *addrlen);
    • 功能:从指定的套接字接收数据,并可以获取发送方的地址信息。
    • 参数
      • sockfd:套接字描述符。
      • buf:指向接收数据的缓冲区的指针。
      • len:缓冲区的大小。
      • flags:接收选项,通常设置为0表示默认(阻塞)方式。
      • src_addr:指向sockaddr结构体的指针,用于存储发送方的地址信息。如果不需要该信息,可以设置为NULL。
      • addrlensrc_addr的大小,或者如果是输出参数,则为接收到的地址信息的实际大小。
    • 返回值:成功时返回接收到的字节数,失败时返回-1。
    • bind 函数
      int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    • 功能:将套接字与特定的IP地址和端口号绑定。在服务器端,这用于指定监听的接口;在客户端,虽然不是必需的,但可以用于指定源地址。
    • 参数
      • sockfd:通过socket函数创建的套接字描述符。
      • addr:指向sockaddr结构体的指针,通常使用sockaddr_in结构体(对于IPv4)或sockaddr_in6结构体(对于IPv6),包含IP地址和端口号。
      • addrlenaddr参数的大小。
    • 返回值:成功时返回0,失败时返回-1。
        connect函数

                        int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

                功能:该函数固定有客户端使用,表示从当前主机向目标
                            主机发起链接请求。
                参数:sockfd 本地socket创建的套接子id
                          addr 远程目标主机的地址信息。
                          addrlen: 参数2的长度。
                返回值:成功 0;
                              失败 -1;

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值