网络编程

apra网
ip:学号 互联网的地址
MAC:身份证号,硬件地址

NAT:地址翻译

ifconfig -a
ping

ARP攻击:
//============网络编程===============
 
网络协议:网络中各个主机或终端接入互联网锁必须遵循的一种规则
         一些代码()
网络协议模型
    OSI(Open System Interconnection))模型:OSI是一个理想的模型,没有实现
    七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
    
    TCP/IP模型:
        网络接口与物理层:通过物理接口发送或接受数据
            MAC地址:物理上唯一的标示一台主机,48位
                 MAC地址是网卡决定的,是固定的。    前三个字节是由IEEE的注册管理机构RA负责给不同厂家分配后三个字节由各厂家自行分配
                 IP和MAC地址这种映射关系由ARP(Address Resolution Protocol,地址解析协议)协议完成。
        网络层:寻找对方的主机在哪里(通过路由器),路由器处于网络层
            IP地址:逻辑上标示一台主机
                ipv4:32位,主机号 + 网络号 (2的32次方)
                ipv6:128位
                四类:A类 1.0.0.1-127.255.255.254
                          主机号(1字节) + 网络号(3字节)
                      B类 172.16.0.0--172.31.255.255
                          主机号(2字节) + 网络号(2字节)
                      C类 192.0.1.1-223.255.255.254
                         主机号(3字节) + 网络号(1字节)
                      D类 224.0.0.1--239.255.255.255
        传输层:保证要传输的数据能够正确无误、无丢失、无重传的发送给对方
                端口号:
        应用层:产生数据,或显示数据
                进程的id,pid
        
 //========TCP/IP======================
 TCP/IP协议是一个协议族:有多个协议组成,因为TCP,IP是这个协议族
 最重要的两个协议
 传输层:
    TCP协议(Transmission Control Protocol):传输控制协议
    UDP协议(User Datagram Protocol):用户数据报协议
 网络层协议:
    IP协议(Internet Protocol):网际协议
    ICMP协议(Internet Control Message Protocol):网际控制报文协议,
     ping命令就是发送的该协议包。
    ARP协议:地址解析协议,将IP地址转换为MAC地址
    RARP协议:反地址解析协议,将MAC地址转换为IP地址
    IGMP协议:
  应用层协议
    FTP协议:文件传输协议 (自己模拟FTP)
    HTTP:超文本传输协议    (解析HTTP协议)
    SMTP:简单邮件传输协议
    DNS:域名解析协议
    SNMP:简单网络管理协议
    Telnet:远程登录协议
 
    
    RTP协议(Real-time Transport Protocol):RTP协议详细说明了在
    互联网上传递音频和视频的标准数据包格式,是介于应用层和传输层之
    间的一种协议
    
 TCP头:
    序号:发送端将数据分段的编号
    确认号:接收端告诉发送端下一个应该发送的字节编号
    窗口(滑动窗口,滑窗管理):接收方发给发送方,告诉发送方,下一次应该发送
        的字节的长度
 
TCP和UDP的区别
    TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高
    可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达
    的通信)
    适用情况:
    适合于对传输质量要求较高,以及传输大量数据的通信。
    在需要可靠数据传输的场合,通常使用TCP协议
    MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
    UDP,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接
    ,所以可以进行高效率的数据传输,实时性较好,主要用在直播、视频会议
    
 
 
 
socket:通信接口、文件描述符、函数API
流式套接字(SOCK_STREAM)----->TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
 
数据报套接字(SOCK_DGRAM)----->UDP
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
 
原始套接字(SOCK_RAW)------->协议的开发者
可以对较低层次协议如IP、ICMP直接访问。
 
 
IP地址
    IPv4:32位
    IPv6:128位
    点分十进制:192.168.7.10
    网络二进制:100010001100 //可以在网络中传输的格式
    
    /*负责点分十进制和网络二进制之间的转换*/
    将strptr所指的字符串转换成32位的网络字节序二进制值
    #include <arpa/inet.h>
    int inet_aton(const char *strptr, struct in_addr *addrptr);
    
    struct in_addr addrptr;//用来保存32位的网络字节序二进制值
    inet_aton("192.168.7.10”,  &addrptr);
 
    功能同上,返回转换后的地址。
    int_addr_t inet_addr(const char *strptr);
    
    int_addr_t  addr;//用来保存32位的网络字节序二进制值
    addr  =  inet_addr("192.168.7.10");
    
    //将IPV4/IPV6的地址转换成binary格式
    int inet_pton(int af, const char *src, void *dst);
    struct in_addr addrptr;
    inet_pton(AF_INET, "192.168.7.10",  &addrptr);//用于IPV4
    inet_pton(AF_INET6, "192.168.7.10",  &addrptr);//用于IPV6
    
    
    //将32位网络字节序二进制地址转换成点分十进制的字符串。
    char *inet_ntoa(struct in_addr in);
 
    char buf[50];
    stuct in_addr inaddr  =  func(xxxxx);
    printf("ip: %s\n",inet_ntoa(inaddr));
    strcpy(buf, inet_ntoa(inaddr));
    
 
 
    
    
    
端口号:16位(1-65535)
    为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别
    1-1024:  系统使用
    1025-5000:系统保留
    5001-65535:用户使用
    
    
字节序
    大端序:高字节放在低地址,低字节放在高地址  internet
    小端序:高字节放在高地址,低字节放在低地址  linux window7
    
    主机字节序到网络字节序
    u_long htonl (u_long hostlong);
    u_short htons (u_short short);
 
    网络字节序到主机字节序
    u_long ntohl (u_long hostlong);
    u_short ntohs (u_short short);
 
//网络编程API
 
/*创建一个通信接口,得到一个套接字文件描述符*/
//使应用层和网卡底层建立关联,启用网络协议
int socket(int domain, int type, int protocol);
param1:地址族
    AF_INET/PF_INET  //用于IPV4的互联网通信
    AF_INET6/PF_INET6 //用于IPV6的互联网通信
    //用于unix套接字,用于同一台主机进程之间通信
    AF_UNIX/PF_UNIX/AF_LOCAL/PF_LOCAL  
param2:套接字类型
    SOCK_STREAM   // TCP  流式套接字
    SOCK_DGRAM    // UDP  数据报式套接字
    SOCK_RAW      // 开发协议  原始套接字
param3:统一为0
返回值:成功,返回一个文件描述符
        失败,返回-1
    
int sock_fd;//主动套接字,该套接字可以主动的向别的主机发起连接请求
sock_fd = socket(AF_INET, SOCK_STREAM , 0);
    
    
/*只有服务器才会调用该函数,为以上的套接字绑定一个IP地址和端口*/
//表示该socket是哪个主机中的哪一个进程所拥有    
int bind(int sockfd,  struct sockaddr  *my_addr,  int  addrlen) ;  
    param1:为哪个套接字进行绑定
    param2:指定要绑定的是哪一个ip,哪一个端口
    param3:存放ip地址和端口的结构体长度
 
    
    struct sockaddr_in  sinfo;
    sinfo.sin_family = AF_INET;
    sinfo.sin_port = htons(8888);
    sinfo.sin_addr.s_addr  = inet_addr("192.168.7.10");
    bind(sockfd,  (struct sockaddr *)&sinfo, sizeof(sinfo)) ;
    
//通用地址结构
 struct sockaddr
  {     
       u_short  sa_family;    // 地址族, AF_xxx
       char  sa_data[14];     // 14字节协议地址
  };
 //ipv4
struct sockaddr_in
  {            
       u_short sin_family;       // 地址族, AF_INET,2 bytes
       u_short sin_port;         // 端口,2 bytes
       struct in_addr sin_addr;  // 存放网络字节序的IPV4地址,4 bytes     
       char sin_zero[8];         // 8 bytes unused,作为填充
  };  
   
   //ipv6
struct sockaddr_in6
  {            
        
  };  
   
struct in_addr
{
     in_addr_t  s_addr;            // u32 network address  
};
 
struct sockaddr_in {}; //ipv4
struct sockaddr_in6 {};//ipv6
struct sockaddr_un {};//unix套接字
    
    
/*将一个套接字设为监听状态,该套接字成为被动套接字,即套接字只能被动接受别的主机的请求,而不能主动连接
别的主机*/
int listen (int sockfd, int backlog);
    sockfd:监听连接的套接字
    backlog:在同一时刻,能接受的连接请求个数(5-10)
 
/*1:接收一个新的连接请求,并返回一个新的套接字,为连接套接字,这个套接字代表一个新的连接
* 2:accept会发生阻塞,直到收到一个接连请求为止
* 3:一个accept只能接收一个连接请求,如果要接收多个请求,必须使用循环*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) ;
    param1:要通过哪一个套接字来接收请求
    param2:用来保存发起连接请求的那一端的信息(ip和端口)。
    param3:保存结构体长度地址
返回值:
        成功:返回一个文件描述符
        失败:返回-1
 
int conn_fd;
conn_fd = accept(sockfd, NULL, NULL) ;    
/*进行数据读取*/
 read(conn_fd, buf, 100);
 
    
    
/*客户端来调用该函数,用来向服务器发起连接请求*/
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
    param1:通过哪个套接字来发送请求
    param2:用来保存服务器的信息,也就是要把连接请求发送给ip和端口为指定的那个服务器
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值