07.14_111期_linux_网络通信

计算机网络背景

协议是一种约定,计算机网络标准同样有自己的官方文档
这种约定规定了不同的符号代表了什么意思,双方能够通过这种约定进行动作

协议本质上是一种软件,要对这一软件进行模块化和解耦合
这种模块化也就是把协议进行分层
比如:两个人在打电话的时候就是分层的,人先对话筒进行说话

其实对于C++,Python等面向对象的语言中也有层状结构,这种层状结构体现在对象的设计上

然而层状结构不仅仅是对象层面上,也有可能是代码的分层

在网络上通信,需要知道 OSI(Open System Interconnection),称为开放系统互联模型
OSI定义了网络协议,网络协议一旦定好,
不同的操作系统,比如Android, Mac os相互之间想要遵循这个网络协议,
这些操作系统的设计工程师就需要 将这个协议实现

OSI模型的七层协议
1. 物理层           2. 链路层
3. 网络层           4. 传输层
5. 应用层(表示层, 会话层)

TCP/IP模型
TCP/IP是一组协议的代名词,他还包括许多协议,组成了一族TCP/IP协议网络间通信,
TCP/IP有五层结构
1. 物理层           2. 链路层
3. 网络层           4. 传输层
5. 应用层(表示层, 会话层)

数据链路层负责设备之间的数据帧的传送和识别

数据从磁盘设备导到内存中 这一操作 同样需要有协议

一旦两个设备距离比较远,长距离通信的成本比较高,
要解决的问题有:
    1. 网络内部通信,A设备发送到当地路由器
    2. 定位目的地:确定B设备在哪个网络地址中
    3. 数据传输不遗失的问题
    4. B设备解码数据的问题

那么 TCP/IP协议就是解决上述问题的解决方案
那什么是 TCP/IP?

虽然不同的设备采用的操作系统不同,而且没有一个统一的标准要求操作系统
但是网络标准都是相同的,
操作系统必须对网络层和传输层进行管理

TCP/IP协议是网络层和传输层的核心协议
主机A发送给主机B的结构体内容,会被主机B直接识别到
这种  你发什么,我都能看得懂的  状态,就称为约定
协议作为一个约定,双方都能够看懂
发送方要发送的是带有 协议报头 的有效载荷,
协议报头就是一个类对象,这个类是固定的,协议报头 + 有效载荷 = 报文

所谓协议,就是通信双方都认识的结构化的数据类型

局域网的标准是不同的,有以太网,令牌网,无线LAN等标准交换机(Switch)工作在数据链路层
调试解调器:光纤和双绞线

两个主机能在一个局域网里直接通信,通信的前提:
局域网中每台主机都有网卡, 网卡的唯一性的标识称为mac 地址
这个mac地址是网卡 的 驱动程序通过协议把网卡里的mac 地址读到操作系统内部
此时操作系统就获得了 mac地址

磁盘也有唯一性标识,这个标识可称为序列号

局域网中的通信过程:
以以太网为例,在任何时刻,只允许一台机器像网络中发送数据
这是因为如果有多态同时发送,会发生数据干扰,这可称之为数据碰撞
    那么所有发送数据的主机要进行碰撞检测和碰撞避免

碰撞避免:两个数据发送方发送数据后发生数据碰撞,
如果让这两个数据发送方都休眠上随机时间之后再发送数据,就称为碰撞避免

也就是说,以太网让任意时刻都只有一台主机发送数据
也就是传输资源的过程智能被一个主机占用,那么传输资源就是临界资源
处于以太网中的一个主机想发消息,必须先试错,看看会不会发生数据碰撞
如果发生数据碰撞,就去执行碰撞避免操作

没有交换机的话,一个以太网就是一个碰撞域

两个主机都将协议分为不同的层,在传输数据的时候,
数据会分为两部分,协议报头和有效载荷,协议报头再

A主机发送数据,要在每一层都加一点报头,最终形成可传输数据的整个过程称为封装
应用层 可以通过 http / ssh / smtp 协议进行添加报头
传输层 可以通过 tcp / udp 协议进行添加报头
网络层 可以通过 ip / icmp 协议进行添加报头
链路层 可以通过 mac 协议进行添加报头
封装 的过程类似于压栈

B主机接收数据,拿到数据帧后,再每一层都要去掉一点报头,最终给到应用层一个数据的过程称为解包
除了应用层,其它层的协议都必须解决一个问题
这个问题就是将有效载荷应该交给上层中的哪一种协议,
每一层确定自己所采用的协议的过程可称为分用
实际上A主机在封装时,就已经把哪一层用了什么协议确定了
解包和分用的过程类似于出栈

不同的网络协议的共性:
    1. 协议解决的问题:报头和有效载荷分离的问题,即解包问题
    2. 每一种协议存在于一段报头中,报头中必须有一个字段来标识所采取的协议是哪种 

确定一下几个称谓:
    数据包到达链路层,将其称为数据帧
    数据包到达网络层,将其称为数据报
    数据包到达传输层,将其称为数据段

IP地址通常用来标识全网当中一台主机的唯一性
一台主机A在网络层添加的报头指明 IP地址,如果这个IP地址不是A所在的局域网内的地址
那么封装之后得到的数据帧将交给路由器去决定怎么传输

A主机通过网络转发数据的时候先在网络层封装的时候就发现:
目标的IP地址不是在A主机所在的局域网,如果不是,进行如下的操作:

将  数据报  传给传输层,在传输层会添加一个mac帧,
该mac帧确定了将传送给当前局域网中的路由器的哪张网卡,
由于网卡都有唯一的mac地址作为标识符,且传输层添加的mac帧中既有 IP地址,又有mac地址
路由器也有自己的网络层和 链路层,
之后路由器进行解包后,就会在网络层得到真正需要到达的 目标IP地址

然后重新封装,经过168 - 172行的操作之后传给目标IP地址的主机

网络层(也可称为IP层)向上看到的所有的报文都是一样的,
所以可以说IP可以屏蔽底层网络的差异,
也就是说,不同的局域网形式并不影响网络层的报文是一样的

IP地址 和 Mac地址的区别
IP地址是传输过程中的最终目标
Mac地址是传输过程中的下一个目标,
之所以在当前阶段选择这个Mac地址α,都是因为到达IP地址当前最优的方案是到达Mac地址α

mac地址只是局域网内的唯一地址

数据在到达应用层以后,操作系统应该把这个应用层交给哪个进程?
实际上是通过传输层的端口号就能确定数据最终交给哪个进程
IP + Port是互联网中唯一的一个进程

网络通信的本质就是进程间通信
IP + Port就是socket,那么网络上的两个进程间通信,也可称为socket通信

那么端口号和 进程 pid的区别是什么?
引入端口号有几个优点
1. 引入端口号,实现了实现系统 和 网络的解耦
   这样系统无论怎么修改一个进程的pid,都不会影响网络的传输
2. 只有那些需要网络通信的进程才会携带端口号

一个端口号只能被一台主机内的一个人占用,端口号是16位的

TCP协议 和 UDP协议
TCP协议是有线的可靠传输
UDP协议是无线的不可靠传输

任何主机在传输数据放到网络中时,这个数据一定要按照大端的方式进行读取
即低地址,高字节

程序员在设计套接字的时候,需要调用大小端转换函数
大小端转换函数包括 htonl, htons, ntohl, ntohs

socketaddr结构
socket编程包括以下两类:
1. 网络套接字,底层使用的是 IPV4, 或者 IPV6等等的网络IP协议来实现跨网络通信的
2. UNIX Domain Socket(域间套接字),用来进行本地通信
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值