Linux网络编程基础-下

1 Socket

1.1 Socket定义

  socket是一个应用编程的接口,它是一种特殊的文件描述符,可对它执行IO的操作函数,比如,read(),write(),close()等操作函数。Socket代表着网络编程的一种资源。Socket并不仅限于TCP/IP协议,它可以面向连接(TCP/IP)也可以面向无连接(UDP和IPX)。

1.2 Socket的类型

1.2.1 流式套接字(SOCK_STREAM)

  提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
  唯一对应着TCP。

1.2.2 数据报套接字(SOCK_DGRAM)

  提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
  唯一对应着UDP。

1.2.3 原始套接字(SOCK_RAW)

  可以对较低层次协议如IP、ICMP直接访问。
  对应着多个协议,发送穿透了传输层。

在这里插入图片描述

1.3 Socket的位置

在这里插入图片描述

2 IP地址

2.1 IP地址概述

1、IP地址是Internet中主机的标识。
2、Internet中的主机要与别的机器通信必须具有一个IP地址。
3、IP地址为32位(IPv4)或者128位(IPv6)。
4、每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由。
5、表示形式:常用点分形式,如192.168.1.1,最后都会转换为一个32位的无符号整数。

2.2 IP地址分类

2.2.1 IPV4

1、点分形式: 192.168.7.246;
2、 32位整数。

2.2.2 IPV6

采用了128位整数来表示。 mobileIPV6: local IP(本地注册的IP),roam IP(漫游IP);

2.2.3 特殊的IP地址

1、 局域网IP: 192.XXX.XXX.XXX
2、广播IP: xxx.xxx.xxx.255。其中255.255.255.255表示全网广播。
3、 组播IP: 224.XXX.XXX.XXX~239.XXX.XXX.XXX

2.3 IP地址转换函数

2.3.1 inet_aton( )

一、函数
将strptr所指的字符串转换成32位的网络字节序二进制值,并存放于addrptr中。
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);

2.3.2 inet_addr( )

一、函数
功能同上,返回转换后的地址。
int_addr_t inet_addr(const char *strptr);
二、参数
strptr: 点分形式的IP地址;函数返回值是32位整数(内部包含了字节序的转换,默认是网络字节序的模式)
三、 inet_aton( )和 inet_aton( )特点:
1、仅适应于IPV4;
2、当出错时,返回-1;
3.此函数不能用于255.255.255.255的转换。

2.3.3 inet_ntop( )

一、函数
将IPV4/IPV6的32位网络字节序二进制地址转换成点分十进制的本地字节序字符串。成功返回 non-NULL,失败返回NULL。
#include <arpa/inet.h>
const char *inet_ntoa(int af,const viod *src,char *dst,socklen_t size)。
二、参数
1、af: 地址协议族(AF_INET或AF_INET6);
2、src:是一个指针(32位网络字节序的IP地址);
3、dst: 输出结果为点分形式的IP地址(主要指IPV4)。

2.3.4 inet_pton()

一、函数
将点分十进制的字符串IP地址转换为32位网络字节序二进制地址,并存储到dst中。
int inet_pton(int af, const char *src, void *dst);
二、参数
1、af: 地址协议族(AF_INET或AF_INET6);
2、src:是一个指针(填写点分形式的IP地址[主要指IPV4]);
3、dst: 转换的结果给到dst。
三、inet_pton()和 inet_ntop( )特点
1、适应于IPV4和IPV6;
2、能正确的处理255.255.255.255的转换问题。

3 端口

3.1 端口作用

  为了区分一台电脑接收到的数据包应该转交给那个任务来进行处理,使用端口号来区别。

3.2 端口号分类

  端口号一般由IANA (Internet Assigned Numbers Authority) 管理。用16位的数字(1-65535)表示。
1、系统已使用的端口: 1~1023。比如:FTP:21;SSH:22;HTTP:80; HTTPS:469。
2、系统保留的端口: 1024-5000。不建议用户使用。
3、用户可以使用的端口:5000~65535。

3.3 端口说明

1、TCP端口和UDP端口是相互独立的,互不影响;
2、网络里面的通信地址是由“ IP地址+端口号 ”来决定的。

4 字节序

4.1 字节序定义

  不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO),也称本地字节序。
1、小端序(little-endian)——低序字节存储在低地址(低-低-小)
将低字节存储在低地址区域(如起始地址),称为“Little-Endian”字节序。如Intel(X86)、AMD、ARM等采用小段模式。
2、大端序(big-endian)—— 高序字节存储在低地址(高-低-大)
将高字节存储在低地址区域(如起始地址),称为“Big-Endian”字节序。比如Powerpc、Mips、ARM作为路由器时、Motorola等采用大端模式。

注意: CPU访问内存中的多字节数据时候才存在大小端问题 。如CPU访问的是字符串,则不存在大小端问题。
在这里插入图片描述

4.2 网络字节序(NBO - Network Byte Order)

为了避免兼容性的问题,网络在传输是统一采用大端字节序模式。

4.3 网络字节序(NBO)和主机字节序(HBO)转换函数

  因为本地直接序(即主机字节序HBO)有大小端模式,而网络字节序(NBO)只有大端模式。所以当终端(电脑、手机等)和互联网交换数据时就设计到字节序大小端的转换
  本地和网络通讯时,只有当本地字节序为小端模式时,才需要转换;当本地字节序为大端模式时,部需要转换,因为网络字节序也是大端模式。

4.3.1 主机字节序到网络字节序转换函数

u_long htonl (u_long hostlong);
u_short htons (u_short short);

4.3.2 网络字节序到主机字节序转换函数

u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值