计算机网络——网络基础

定义

局域网LAN:

多台计算机通过交换机连接在一起,局域网和局域网之间通过路由器连接,实现数据的跨网络传送,局域网之内的两台主机可以直接通信

广域网WLAN:,

将远隔千里的计算机连接起来,“广”是相对的

网络:(自顶向下)

应用层,传输层,网络层,数据链路层(,物理层)

网络协议栈:

是一个软件,核心是贯穿体系结构的TCP/IP协议栈,属于OS的一部分

协议:

软件的一种,

协议分层:

通过分层完成解耦,每层可以进行替换而不会互相影响,出现问题也不会互相影响

OSI:定义网络协议的组织

制定了七层网络模型(开放式系统互联参考模型):物理层,数据链路层,网络层,传输层,会话层,表示层,应用层(自底向上)

TCP/IP四层模型:

数据链路层,网络层,传输层,应用层

每一层的功能

(1)数据链路层:负责设备之间数据帧的传送和识别。特定硬件所匹配的驱动模块,负责软件工作(与硬件强相关)
(2)网络层:负责地址管理和路由管理,路由器工作在网络层
(3)传输层:负责两台主机之间的数据传输
(4)应用层:负责应用程序间沟通

当前层中,报头+有效载荷

TCP/IP通讯过程:

应用层添加报头,整体打包,传到传输层,再添加报头打包,向下交付到网络层,再添加报头,交付到链路层,添加报头发送到对端,对端接收时每层会去掉当前层对应的报头并向上交付
不断添加报头的过程称为封装,不断解析报文的过程称为解包
同层协议:每一层都认为自己在和对方直接通信

报头的意义:

需要报头中的数据,来指导当前层进行某种协议决策:传输层指导如何传输,网络层指导如何进行路径选择,链路层指导如何进行“下一跳”转发

报头的内容:

几乎每一层协议的报头中,都要包含两种字段:
(1)当前报文的有效载荷要交付给上层的哪一个协议(分用)(2)明确报头和有效载荷的边界(解包)

ifconfig
eth0:网卡接口
inet:内网地址
ether:以太网地址

以太网:

一个局域网,每台主机有一个MAC地址,发送的报文中不是自己的MAC地址,则该主机将收到的报文丢弃,只有对应MAC地址的主机接收报文。
局域网中任意一个时刻都只能用一台主机向局域网中发送信息,如果同时发送可能产生数据碰撞问题,因此每台主机都要有碰撞检测的能力和碰撞避免的算法。

令牌环:

只有拥有令牌的主机才能向局域网发消息,发完消息后将令牌交给下一台主机(互斥锁)

MAC地址:

48位,每台主机全球唯一的序列号地址,主要用来标识局域网内的主机,上一站从哪里来,下一站去哪里(一直在变化)

IP地址:

最起点,到最终点(几乎一直不变),指导一个报文该如何进行路径选择,公网IP地址:唯一的标识互联网中的一台主机

端口号PORT:

唯一的标识一台机器上的唯一一个进程
一个进程可以有多个端口号,一个端口号只能关联一个进程
ip地址+port:组成套接字socket,可以准确找到某一台主机的某个进程,进行进程间通信

路由器:

屏蔽了底层网络的差异

IP:

底层最核心的协议,IP层及以上看到的都是同一种网络,解决了两台物理机器之间互相通信

应用层内包含进程,保证两台主机双方用户之间能看到发送和接收的数据(进程间通信)

传输层

传输层协议:
TCP:可靠的,有连接,面向字节流
UDP:不可靠的,无连接,面向数据报

字节序列
规定:凡是到达网络中的数据,必须是大端字节序(低地址高字节)

网络通信的标准方式:基于ip的网络通信,AF_INET,原始套接字,域间套接字

UDP网络通信相关函数
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);

参数:
int domain:种类,需要操作系统提供哪种通信服务,如AF_UNIX,AF_INET,AF_INET6等
int type:类型,哪种套接字,如SOCK_STREAM(流式套接:TCP),SOCK_DGRAM(支持数据报:UDP)等
int protocol:协议,置0
返回值:
创建成功返回一个文件描述符

绑定

int bind(int socket, const struct sockaddr *address, socklen_t address_len);

参数:
int socket:创建好的套接字的fd
const struct sockaddr *address:需要用户指定服务器的相关socket信息
socklen_t address_len:传入结构体的大小

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;//16位 端口号
    struct in_addr sin_addr;//32位结构体

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
			   __SOCKADDR_COMMON_SIZE -
			   sizeof (in_port_t) -
			   sizeof (struct in_addr)];
  };
 #include <arpa/inet.h>
 // h:host n:net l:long s:short
       uint32_t htonl(uint32_t hostlong);
       uint16_t htons(uint16_t hostshort);
       uint32_t ntohl(uint32_t netlong);
       uint16_t ntohs(uint16_t netshort);
 #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>

       int inet_aton(const char *cp, struct in_addr *inp);
// 转化IP格式的函数
       in_addr_t inet_addr(const char *cp);

从udp中读

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

int sockfd:创建的套接字
void *buf, size_t len:提供的缓冲区和大小
int flags:读的方式,默认置0
struct sockaddr *src_addr:输入:要提供一段空间;输出:表明谁向你发的数据,表明了和你的服务器通信的客户端的套接字信息
socklen_t *addrlen:结构体长度

发送数据

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

const struct sockaddr *dest_addr:对端套接字信息

TCP网络通信相关函数

创建套接字

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);

监听套接字

int listen(int sockfd, int backlog);

获取新的连接

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

参数:
int sockfd:设置的监听套接字的文件描述符
struct sockaddr *addr:
返回值:返回获取的套接字的文件描述符,accept返回的套接字提供IO服务

连接(客户端)

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

参数:
const struct sockaddr *addr:服务器的地址
返回值:
连接或绑定成功,返回0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值