Linux网络编程01
网络层级
协议
协议:两个对等实体对通话内容的约定,一个协议是对应收发双方相同层级的
常见的协议
应用层(公开协议):
http
协议(浏览网页);客户端(浏览器)发请求;服务端(nginx,apache,tomcat)
ssh
远程连接
ftp
上传/下载
SMTP/pop3
电子邮件
其他协议可以查看官方RFC文档 RFC Editor
私有协议:KCP
。 QQ,微信,游戏(堆延迟比较敏感),金融使用的是私有协议,可以根据不同场景按需定制功能,并且更安全内核协议栈(传输层,网络层,接口层)----内核进程
传输层:
TCP
:可靠的,面向连接的(使用管道)
UDP
:不可靠,无连接的(消息队列)
SCTP
:音视频
网络层
IP
:给每个主机分配一个地址,找到目标地址的路径(路由)
ICMP
:ping命令使用的协议,控制消息协议
IGMP
(组):广播协议
接口层
ARP
:IP
地址转换为MAC
(物理)地址的协议
数据的传递
逻辑上 是对等协议
实际上是只能上层和下层之间传递
PDU
:协议数据单元
CRC校验和
:将前面的数据计算出一个结果,检查在传输的过程中是否发生数据跳变,验证数据的完整性
交换机工作在L2(数据链路层),在一个广播域里面不同的机器之间传递,拓展广播域
路由器工作在L3(网络层),在不同的服务器之间转递,可以从一个局域网发送到另一个局域网
如何去定位一个主机,如何定位一个进程
使用IP地址去定位一个主机
,IP
地址工作在网络层,交换机无IP
地址因为交换机工作在链路层;路由器由IP
地址,网关就是路由器
windows
下查看IP
信息ipconfig
Linux
下查看网络命令ifconfig
[ens33
以太网网卡,lo
本地环回设备用于本机通信]如果客人端和服务端都在本地就不会今年过网卡,直接走本地环回
通过端口号标识不同的进程
,端口号范围0 ~ 65535(2bytes)
,
windows下查看端口号netstat -an
数据链路层
交换机的作用拓展广播域
mac地址 物理地址
如果在同一个广播域里面的主机之间相互发送消息,那么交换机就会根据主机的mac
地址来找到目标主机和发送方主机
校验和的目的是防止比特跳变,目标主机收到帧之后会堆前面的数据进行计算,将计算出来的结果和检验和进行比对,如果没有比对成功那么就会丢弃此帧
目的地址(48位):MAC
地址
源地址(48位):MAC
地址
传送的数据最小是46,如果不满46就补0
最大是1500
—MTU最大传输单元
:数据部分的大小限制(历史遗留问题)
ARP(地址解析)协议
找到某一个设备的MAC地址
当主机A要找到目标地址时,在局域网内会通过广播ARP请求来询问局域网中的主机谁是目标主机,目标主机应答主机A,然后主机A就可以通过交换机找到目标主机发送信息,就可以不用在以广播的方式来发送信息
广播的包,目的地址全是F,交换机帮需要广播的主机来发起广播,
不是广播的包,目的地址是目标主机的MAC地址,
网络层
只有数据链路层只能在局域网里面进行通信,但是加入网络层之后我们可以和更远的主机进行通信
网络层的核心协议IP协议,负责把数据包送出广播域
数据在网络中传递并不是直接传送到目的地址的,而是在逐跳传播的网络
中,找到一条从起点到终点的路径,找到路的路以及找路的过程都叫做路由,路不仅仅只有一条
IP地址
IPv6
128位
IPv4
32位 ,4字节的整数,使用点分十进制来表示
NAT技术
实现IP地址的转换,我们现实中的光猫就是实现NAT转换的,他分为内网和外网,他将连接他的许多主机分配一个内网IP,内网主机需要发送网络请求请求外网时,会使用NAT转换将内网IP转换为真实的光猫的物理IP向外网发送请求,当外网返回请求响应时,光猫通过NAT转换将外网IP转换为内网IP,然后通过记录表将返回的数据发送给内网主机
NAT认为一些地址是内网地址
10.0.0.0/8 ~ 10.255.255.255
172.16.0.0/12 ~ 172.31.255.255
192.168.0.0/16 ~ 192.168.255.255
其他保留IP地址
IP数据报
一行有32bit = 4byte = 1个字长
最上面除了数据部分是IP头
和上面我们提过的一样IP数据报时放在以太网帧里面,以太网帧以头,尾将IP数据报包裹,进行发送
版本指定是IPv4还是IPv6,首部长度单位是4Byte,最短20Byte,最长60Byte
分片和重组
以太网帧(MTU
)比IP数据报的长度上限要小,所以一个以太网帧装不下一个IP数据报,
因此我们需要对IP
数据报进行分片和重组,在来源进行网络分片,目的主机网络层进行重组,分片在网络中独立传播,
网络层是不可靠的,如果发现数据包丢包,不会重传,会直接将数据包丢弃
每一个分片是一个单独的IP数据报,有属于自己单独的IP
头
属于同一个原始IP报的分片里面有相同的标识
TTL的意义
网络层是逐跳传播的,因此数据有可能会在网络中无限循环,那么我们要怎样避免这个问题呢
我们会给每个数据包设计一个TTL寿命,其可以记录数据包在网络中存在的时间,当时间到达指定值数据包就会被销毁,但是也可以通过记录数据包在网络中经过网络每一级的数量,指定数据包只能在网络里面执行几跳
路由器的原理
路由器工作在L3网络层
如果数据包的目的IP地址不在广播域内,路由器回暖根据数据包的IP地址,向外做转发操作
查看路由表
Destination
:目的地址
Gateway
:网关/路由器(下一跳转发给谁),如果是0.0.0.0那么就是转发给自己的广播域
Genmask
:掩码,我们输入一个IP
地址,IP
地址会与掩码按位与,得到的结果会去和Destination
作比较,我们会去比较的出来的结果和我们的IP
地址哪个是最长,最长的就是我们要转发的目标,,然后可以通过Gateway
来确定我们要向外网转发还是局域网内进行转发,最长前缀匹配
每隔一段时间路由表就会更新
ICMP协议
ICMP协议是网络层;ICMP是网网络层的高层,实际上是基于IP协议的
ping( )是基于ICMP实现的
tracert(windows)
传输层TCP
面向连接的协议,可靠,全双工,端到端的通信,不支持广播和组播
面向连接
:存在已连接状态和未连接状态两个状态,但是已连接状态才能通信。数据的传递一般是无连接的,但两端的通信一般是有连接的
可靠
:之前学到的协议都是不可靠的,链路层到网络层的协议都是不可靠的,可靠的意思就是如果发生丢包和坏包会重传。
TCP怎么样建立和断开连接?
建立连接(三次握手)【建立全双工通信过程,确认两个管道的正常通信】
(1)A向B发送请求
(2)B收到A的请求,B向A发送A的确认并且携带B对A的请求
(3)A收到B的确认以及携带的请求,向B发送确认
建立连接的意义
(1)让自己转换为已连接状态;
(2)获取(交换)初始序列号(因此要规定初始序列号要根据不同时间点生产序列号),规定哪些序号是合法(可以被接收处理)的信号,
两台主机的时钟不一定是一直的,因此双方需要交换彼此的初始序列号
TCP建立连接
SYN-SENT
是已经发送请求连接状态
客户端才能主动发起连接
断开连接(四次挥手)
服务端和客户端都可以发起断开连接
断开过程中,发起断开多的数据FIN M
以及FIN N
如果出现丢包,那么可以重新发包进行断开,但是ACK M+1
和ACK N+1
数据包如果丢了,是很严重的事情,因为这时候发送ACK
的主机如果已经关闭,数据包如果发生丢包,那么另一个主句就会一直向主机重发FIN
请求关闭的数据包,
因此不是发送ACK
的主机发送完就直接关闭,而是需要等待到确保能够重传一次的时间之后再关闭(等待两倍MSL
)
设置两倍MSL时间原因是
(1)确保重传一次ACK
(2)确保旧的包再新连接建立时已经消逝
MSL
是根据TTL
进行计算的,TTL
是固定的,跟网络状态无关,
查看MSL
(60秒)
TCP段的头部
IP数据报一般头部长度20个字节
TCP段头部一般长度为20个字节
端口号:0 ~ 65535
序号:SEQ
确认序号:ACK
首部长度:最小20Byte,最大60Byte,和IP数据包的限制都是一样的
URG
:如果为1,那么紧急指针是有用的,如果不为1时,那紧急指针是无用的
ACK
:如果为1,那么说明这个数据包还起到确认的作用
PSH
:快速关闭
RST
:说明包出现错误
SYN
:建立连接请求
FIN
:断开连接请求
窗口大小:改变发送方的发送窗口
选项:绝大多数情况都没有,如果有一般都是通知MSS
(最大报文长度),为了尽量避免分片和重组,一般都会让TCP数据少于其最大可传输数据,确保段不会分片。一般第一次连接的时候才会超过20会有选项这一个数据项,其他的时候都没有这个选项
实现重传需要怎么做?
(1)确认机制,对方在收到你发的包之后要发送确认收到的信息,保证信息已经成功发送到目标主机
(2)缓冲区保存已发送未确认的数据,
(3)设置定时器,在定时器到点之前如果没有收到目的主机的确认信息,那么就会重新发送这个数据包
(4)序号机制(每个数据包的序号不一样,相同的两个包序号相同)避免目标主机收到重复的包
(5)异步发送提高发送数据包的效率,同时目标主机返回的确认信息也要携带序列号信息
限制速度
为了避免发送包的速度太快,导致目标主机无法迅速反应,
在发送主机会限制已发送未确认包的数量(滑动窗口机制,为了限制发送速度)
窗口越小发送的速度越小