华清学习笔记网编day1-网络基础

网络发展史

internet发展历史
https://docs.qq.com/doc/DZVhHQ25Zd3RHZGRu?u=a4688ea9bab7477c9f488554dff0c36a
1.最早的互联网叫什么?
阿帕网

2.TCP协议分成了连个不同的协议
TCP/IP
用来检测网络传输中差错的传输控制协议TCP
专门负责对不同网络进行互联的互联网协议IP

交换机与路由器

交换机:用于局域网内网的数据转发
路由器:用于连接局域网和外网,也能进行数据转发
在这里插入图片描述
现在大部分路由器都有有交换机的功能;
但是交换机没有IP分配和IP寻址的功能,所以交换机没有路由器的功能。
在这里插入图片描述

ip地址:

1)IP地址是Internet中主机的标识,本质: 二进制
IP地址一般分割为 4个八位二进制的数(4字节-32位)
2)Internet中的主机要与别的机器通信必须具有一个IP地址
3)IP地址(长度)为32位(IPv4),128位(IPv6),目前ipv6还未普及,主要学习ipv4
4)每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由
5)表示方法 : 点分十进制
点分十进制表示就是用4组从0~255的数字,来表示一个IP地址。

二级划分:

IP = 网络号 + 主机号
网络号:表示是否在一个网段内,用于区分网段 (同一网段为同一局域网)
主机号:在本网段内的ID,同一局域网不能重复
在这里插入图片描述
A类:(0.0.0.0-127.255.255.255)(默认子网掩码:255.0.0.0)
第一个字节为网络号,后三个字节为主机号(一个字节占8位)。该类IP地址的最前面为“0”,因为网络号是8位,所以地址的网络号取值于 0~127之间(0000 0000)(0111 1111)。
一般用于大型网络,主机号取值在0 - 2 ^24之间. 127.0.0.1:本机回环地址 10

B类:(128.0.0.0-191.255.255.255)(默认子网掩码:255.255.0.0)
前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。
一般用于中等规模网络。

C类:(192.0.0.0-223.255.255.255)(子网掩码:255.255.255.0)
前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。
一般用于小型网络(一般教室使用的是C类)。

D类:(224.0.0.0- 239.255.255.255)是多播地址。
该类IP地址的最前面为“1110”,所以地址的范围取值于224~239之间。
一般用于组播用户,组播通信。

E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的取值取值于240~247之间。
一般是一些保密单位用得到,平时基本不会用到

特殊地址:

0.0.0.0: 在服务器中, 0.0.0.0指的是本机上所有的IPV4地址
0.0.0.0 是一个特殊的IP地址,用于表示服务器端将监听所有可用的网络接口,
而不仅仅是IP地址,广播地址等也会监听
127.0.0.1:回环地址/本机地址,一般用来本地测试使用,所有发往该类地址的数据包都应该被原样送回
网络地址: 每一个网段主机号为0的地址; 如: 192.168.50.0
它是网络中的一个特殊地址,不能被分配给任何具体的主机。
广播地址: 主机号最大的地址是该网段的广播地址
如: b类IP 广播地址为: 129.223.255.255
全网广播地址:255.255.255.255 该地址不能随便用,会影响这个网络 - 国家主席-

练习 1: 网段为192.168.1.*** ,同一网段最多可以连接多少个主机?
C类 >> 0 - 255 >> 256个ip ip去掉网络地址和广播地址 256 - 2 = 254;

子网掩码: 用于划分子网

目的:将某一个IP划分成网络地址和主机地址
特点:
1. 长度跟IP一样,32bit的二进制数组成
2. 连续的1和0组成
网络地址都为1
主机地址都为0
练习2:已知一个子网掩码号为255.255.255.0,问,最多可以连接多少台主机?
根据子网掩码特点, 网络号全部为1, 主机号全部为0
可以得出, 前三个字节都为网络号, 最后一个字节0为主机号
最后一个字节为0 , 一个字节占8位, 所以主机号最多容纳 1111 1111
主机号最多为 0 - 255, 共256, 去掉网络地址和广播地址,则为 254

举例: 如果有800台电脑, 在不浪费ip情况下, 选用哪个网段?
800个人, B类最合适
选用B类,仍然会浪费大量的ip, 所以继续划分,采用三级划分

三级划分

作用: 重新划分网络号和主机号 , 也就是重新组网 , 从而提高资源利用率
二级划分 IP = 网络号 + 主机号
三级划分 IP = 网络号 + 子网号 + 主机号

回到刚才的问题, 800台电脑, 选用B类IP,会浪费六万多个ip
B类ip主机号为16位, 通过计算得知, 800台电脑二进制表示是 11 0010 0000
所以主机号要保留后十位,其他位数都可以划分为子网号, 这样就提高了资源利用率

笔试1:某公司有四个部门:行政、研发1、研发2、营销,每个部门各30台计算机接入公司局域网交换机,如果要在192.168.1.0网段为每个部门划分子网,子网掩码应该怎么设置,每个子网的地址范围分别是什么?(4个部门之间不能通信)
C类
三级划分: 192.168.1.0
192.168.1.00 00 0000 - 192.168.1.00 11 1111
192.168.1.0 - 192.168.1.63 >> 62台

                   192.168.1.01  00 0000 - 192.168.01 11 1111
                      192.168.1.64   -   192.168.1.127   >>    62台

                   192.168.1.10 00 0000 - 192.168.1.10 11 1111
                       192.168.1.128  -   182.168.1.191 

                   192.168.1.11  00 0000 - 192.168.1.11 11 1111
                        192.168.1.192  -  192.168.1.255

子网掩码: 255.255.255.192

练习3:有两台电脑主机,在最少浪费IP地址的情况下.将172.16.14.4与172.16.13.2划归为同一网段,则子网掩码应该设置为
B类
172.16. 0000 1110 0000 0100
172.16. 0000 1101 0000 0010
子网掩码:
255.255.252.0

网络模型

网络的体系结构
1.网络采用分而治之的方法设计,将网络的功能划分为不同的模块。
2.每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务
3.网络体系结构即指网络的层次结构和每层所使用协议的集合
4.两类非常重要的体系结构:OSI与TCP/IP

OSI模型(理想化)
用作教学和理论研究
在这里插入图片描述
OSI模型是最理想的模型
物理层:传输的是bit流(0与1一样的数据),物理信号,没有格式
链路层:格式变为帧(把数据分成包,一帧一帧的数据进行发送)
网络层:路由器中是有算法的,ip,(主机到主机)(路由的转发)
传输层:端口号,数据传输到具体那个进程程序(端到端)
会话层:通信管理,负责建立或者断开通信连接
表示层:确保一个系统应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解 析,管理数据加密,解密;
应用层:指定特定应用的协议,文件传输,文件管理,电子邮件等。

TCP/IP模型

在这里插入图片描述
网络接口和物理层:屏蔽硬件差异(驱动),向上层提供统一的操作接口。
网络层:提供端对端的传输,可以理解为通过IP寻址机器。
传输层:决定数据交给机器的哪个任务(进程)去处理,通过端口寻址
应用层:应用协议和应用程序的集合

OSI模型和TCP/ip模型层级关系
在这里插入图片描述
协议: 双方约定好的规则

网络接口和物理层:
ppp:拨号协议 —老式电话线上网方式
ARP:地址解析协议 IP–>MAC 通过IP地址可以获取对方的MAC地址
RARP:反向地址转换协议 MAC–>IP 通过MAC地址可以获取对方的IP地址
网络层:
IP(IPV4/IPV6):网间互连的协议 —不同主机连接
ICMP:网络控制管理协议 — ping命令使用
IGMP:网络分组管理协议 —广播和组播使用
传输层:
TCP:传输控制协议 —端对端的接口
UDP:用户数据报协议 —端对端的接口
应用层:
SSH:加密协议 — git工具,远程仓库
telnet:远程登录协议
FTP:文件传输协议
HTTP:超文本传输协议 — 网址 https//
DNS:地址解析协议 — 将网址解析为IP地址
SMTP/POP3:邮件传输协议 —邮件传输

UDP和TCP

UDP/TCP协议: 共同点: 都存在于传输层 — 全双工通信

单工: 发送方只能发送数据,接收方只能接收数据(收音机)
收音机对于和电台来说,收音机是接收方,电台是发送方
收音机对于人来说,收音机是发送方,人是接收方
半双工: 可以作为发送设备,也可作为接收设备,同一时刻只能接收或发送(对讲机)
全双工: 同一时间可发送也可接收 (打电话)

TCP(传输控制协议)

是一种面向连接的传输层协议, 它能提供高可靠性

(判断是否高可靠性: 数据无失误,数据无丢失,数据无重复,数据无失序)
高可靠性的原因:

  1. 三次握手,四次挥手机制
  2. 序列号和应答号机制
  3. 超时/错误 重传机制

适用情况:

  1. 适用于 对传输质量要求较高 ,以及传输大量数据
    2, 用于高可靠性传输的场合
  2. QQ/微信的账号登录,账号设置, 文件输出

UDP(用户数据报协议)

UDP用户数据报协议: 无连接,不可靠的协议

UDP不需要连接,所以进行高效率传输

适用情况:
1.在接收到数据.给出应答较为困难的网络
2. 用于广播/组播
3.QQ/微信 视频通话/语音电话
4.流媒体,VoIP,IPTV等网络服务

为什么学习socket
IO中,普通的io操作: 打开文件 -> 读/写文件 ->关闭文件 (本地进程通信)
socket: 实现两个不同的操作系统或主机, 进行两个进程间的网络通信

套接字(socket)简介 — 新的通信机制

发展:
1》1982 - Berkeley Sotware Distributions 操作系统引入了socket作为本地进程之间通信的接口
2》1986 - Berkeley 扩展了socket 接口,使之支持UNIX 下的TCP/IP 通信
3》现在很多应用 (FTP, Telnet) 都依赖这一接口

Socket简介:

1、可以认为是一个编程(函数)接口
2、也可以认为是一种特殊的文件描述符 (socket的返回值是一种文件描述符) >> fd – 相当 于打开了网络设备
3、socket是一种通信机制,并不仅限于TCP/IP协议,
4、面向连接 (TCP)
5、 无连接 (UDP)
socket套接字的类型
流式套接字(SOCK_STREAM) 对应的匹配协议 >> TCP
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制(百度网盘限速),避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM) 对应的匹配协议 >> UDP
提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)
可以对较低层次协议如IP、ICMP直接访问,还有一些ping命令,都是原始套接字

功能:在内核空间内创建两个缓存区,一个接收缓存区,一个发送缓存区,用户可以接收到两块空间的文件描述符
在这里插入图片描述

Socket的位置:

在这里插入图片描述

端口号Port

1.为了区分一台主机接收到的数据包应该给哪个进程来进行处理,使用端口号来区别
(通过 IP地址 找到哪台主机 通过 port端口号 来找到哪台主机的哪个进程)
2.TCP端口号与UDP端口号独立 (UDP port为8888,TCP port也可为8888 )
3.端口号一般由IANA (Internet Assigned Numbers Authority) 管理
4.端口(sin_prot)用2个字节表示 2byte (IP地址占4个字节)

众所周知端口(被占用): 11023(1255之间为众所周知端口,通常由UNIX系统占用)
比如 文件传输端口 TFTP 端口号为 69
已登记端口:1024~49151 (----可用来建立与其它主机的会话----) 动态或私有端口:49152~65535 --固定某些服务使用–

字节序

字节序: 不同类型的cpu主机,内存存储大于一个字节类型的数据在内存中的存放顺序。
分类:
小端序(主机字节序) - 低地址 存放 低字节
大端序(网络字节序)- 低地址 存放 高字节

网络中传输的数据必须使用 网络字节序,即大端字节序
终端中显示的数据必须为 主机字节序,即小端字节序
在这里插入图片描述
在这里插入图片描述
网络传输中,需要将每个主机的主机字节序(CPU决定),转换为网络中统一顺序的网络字节序
才能供双方主机去识别
只需要转换IP和port就可以,不需要转换传输的数据包的字节序
因为IP和port为 4个字节和2个字节, 而数据报一般都为char类型, 占一个字节
根据字节序的性质,内存存储大于一个字节类型的数据在内存中的存放顺序。
所以char类型并不具有字节序的概念

端口地址转换

网络上用网络字节序 , pc主机上显示的是主机字节序

htonl/htons主机字节序(host)到网络(network)字节序

ntohl/ntohs 网络字节序到主机字节序
在这里插入图片描述

IP地址转换

主机字节序转换为网络字节序
inet_addr()

网络字节序转换为主机字节序
inet_ntoa()
在这里插入图片描述

TCP编程

在这里插入图片描述
在这里插入图片描述
客户端: 发送请求
服务器端: 相应请求

步骤

服务器端(server):

  1. socket(),创建套接字文件,创建出用于连接的套接字文件
  2. bind(), 绑定,把socket()函数返回的文件描述符和IP、端口号进行绑定;
  3. listen(), 监听,将socket()返回的文件描述符,由主动套接字变为被动套接字;
  4. accept(), 阻塞函数,阻塞等待客户端的连接请求, 返回一个用于通信的套接字文件;
  5. recv(), 接收客户端发来的数据;(read)
    //6) send(), 发送数据;(write)
    7)close(), 关闭文件描述符; 至少要关闭: 连接、通信

客户端(client):
1.socket(),创建套接字文件,既用于连接,也用于通信;
填充结构体: 填充服务器的ip和端口 , 用于connect连接
2) connect(); 用于发起连接请求,阻塞等待连接服务器;
3) send(), 发送数据;
//4) recv(), 接收数据;
5)close(), 关闭文件描述符;

可以使用write代替send, 都属于往发送缓存区内写入数据
read代替recv , 都属于往接收缓存区内提取数据

函数接口:

服务器 server:
1.socket创建套接字
2.bind绑定套接字
通用结构体struct sockaddr 与 ipv4结构体struct sockaddr_in 大小一致
可以进行结构体强转
在这里插入图片描述
3.listen监听
4.accept阻等待连接
5.recv
./server:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <arpa/inet.h>

int main(int argc, char const *argv[])
{
    //1.创建套接字 - 返回建立连接的文件描述符
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        perror("socket is err:");
        return -1;
    }
    printf("sockfd: %d\n",sockfd);

    //2. 绑定套接字  -  填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(8889); //填充端口
    saddr.sin_addr.s_addr = inet_addr("192.168.50.63");//填充ip
    
    if(bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)) < 0)
    {
       perror("bind is err:");
       return -1;
    }

    //3.监听 - 将主动套接字转换为被动套接字
    if(listen(sockfd,5) < 0)
    {
       perror("listen is err:");
       return -1;
    }
    //4.阻塞等待客户端的连接, 返回一个建立通信的文件描述符
    int acceptfd = accept(sockfd,NULL,NULL);
    if(acceptfd < 0)
    {
       perror("accept is err:");
       return -1;
    }
    printf("acceptfd is %d\n",acceptfd);
    
    //5.既然链接成功, 建立通信
    char buf[128] = "";
    while(1)
    {
        int recvbyte = recv(acceptfd,buf,sizeof(buf),0);
        if(recvbyte < 0)
        {
            perror("recv is err:");
            return -1;
        }
        else if(recvbyte == 0)
        {
            printf("the client is exit\n"); 
            //当客户端退出, 则退出本次接收数据
            break;
        }
        else
        {
            printf("%s\n",buf);
        }
        
    }
    //关闭文件描述符
    close(acceptfd);
    close(sockfd);
    
    return 0;
}



./client:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <arpa/inet.h>

int main(int argc, char const *argv[])
{
    //1.创建套接字 - 返回一个建立连接的文件描述符
   int sockfd = socket(AF_INET,SOCK_STREAM,0);
   if(sockfd < 0)
   {
       perror("sockfd is err:");
       return -1;
   }
   //2. 主动连接
   //填充结构体
   struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(8889);
    saddr.sin_addr.s_addr = inet_addr("192.168.50.63");
   //连接  当connect链接成功之后, sockfd自然也就具有了建立通信的作用
   if(connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)) < 0)
   {
       perror("connect si err:");
       return -1;
   }
   //3. 发送或接受消息
   char buf[128];
   while(1)
   {
       fgets(buf,sizeof(buf),stdin);
       //send的文件描述符是建立通信的文件描述符
       send(sockfd,buf,sizeof(buf),0);//写阻塞
   }
   close(sockfd);
    return 0;
}

优化代码:
1.客户端发送去掉fgets获取的多余的’\n’.
2.客户端端口和ip地址通过命令行传参到代码中;(如果参数不一致,应该提示并退出)
argv[ *] argc

3.服务器设置来电显示功能,每次客户端来连接,都会打印的客户端的ip和端口。
int acceptfd = accept(sockfd,(struct sockaddr *)&caddr,&len);
打印时记得网络转主机
4.设置服务器端自动获取自己的ip地址
“0.0.0.0”
5.实现循环服务器,服务器不退出,当链接服务器的客户端退出,服务器等到下一个客户端链接。
6.当客户端输入quit的时候,客户端和服务器服务器都要退出
strncmp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值