其他分享
首页 > 其他分享> > 计算机网络的super super easy 教程 | DNAT和SNAT UDP和TCP

计算机网络的super super easy 教程 | DNAT和SNAT UDP和TCP

作者:互联网

DNAT(目标地址转换,Destination Network Address Translantion):修改数据表的目的IP地址

作用(应用环境):在互联网中发布位于企业局域网内的服务器

                           在互联网中发布内网的服务器

将一个网络服务器发布出来,让另外的网络能够使用

发布:背后是对内部资源的管控

SNAT和DNAT可以共存

DNAT实验:

  1. 内网的服务器配置好ip和网关,dns
  2. 内网的服务器搭建好web服务,启动nginx
  3. 网关服务器开启路由功能配置好dnat策略

-t nat:指定nat表里操纵

-A prerouting :在这个位置添加一条规则

-i eth0:从eth0接口进入系统

-d ip:目的ip地址

-p tcp –dprot 80:传输层采用tcp协议 同时目的端口是80

-j DNAT:采取DNAT策略

--to-destination 192.168.1.6:修改目的ip为192.168.1.6

netfilter是一个七层

DNAT如何发布内网不同的服务器呢?

使用不同端口号来对应内网不同的ip地址服务器

dnat修改IP包的目的IP地址,还可以修改tcp或者udp的目的端口号

如果不修改端口号的话,进来什么端口出去就是什么端口(所以可以不接端口号)

SNAT:站在用户角度 帮助用户上网

DNAT:站在企业角度 将服务器发布出去

跳板机(堡垒机,中控机):表示对于外网只开放连接一台机器 通过这个机器再去连接其他机器,保护内部的安全

传输层:

四层(传输层)负载均衡:TCP和UDP          端口号(源端口和目的端口)

TCP:面向连接,可靠,手续多,速度慢

UDP:无连接,不可靠,手续少,速度快

根据业务的特点:也就是应用层软件的特点进行选择(二者必选其一)

OSI是先有模型 可以适用于各种协议栈

TCP/IP是先有协议,后有模型 只适用于TCP/IP网络

IP层实现了点到点的连接 传输层提供了端到端的连接

不同的应用程序监听不同的端口 通过不同的端口号来区别

常见的服务对应的端口号:

nginx 80

mysql 3306

ssh 22

dns 53

QQ 8000

TCP(传输控制协议) 可靠 面向连接 传输效率低 == 打电话

三次握手,四次断开 体现的是面向连接

       各种计时器(重传计时器等)体现的是可靠

       传输效率低体现在面向连接,总是需要确认

UDP(用户数据报协议) 不可靠 无连接 传输效率高  == 发短信

TCP工作原理:

TCP封装格式:TCP头部封装(IP包头部封装)占20个字节

源端口(发送进程的)(16位  2字节) 

目的端口(接收进程的)(16位   2字节)

端口号的范围:0~65535

32位序列号(seq)(自己发送数据打的标识  标识第多少段)

32位确认号(ack)(对发送端的确认信息,告诉发送端这个序号之前的数据段已收到)

6个标志位(ctl)(包括URG ACK PSH PST SYN FIN):0或1

URG(紧急指针有效位):数据比较急 优先处理

ACK(确认序列号有效位):表明数据包包含确认信息

PSH:通知应用程序尽快处理数据,不在缓存中停留

RST:重新建立连接

SYN:同步 请求建立连接

FIN:数据发送完毕,请求断开连接

16位窗口大小(可变):滑动窗口的大小,指明本地可接受数据的字节数(最大可用是65536)(通过滑动窗口的大小控制来进行TCP的流量控制)

TCP的连接:三次握手

established:建立连接

查看服务器状态:netstat 命令查看

-a:所有

-n:以数字形式显示(否则会以名字形式 需要域名解析)

-p:程序的名字

-l:表示正在监听状态

-u:udp

-t:tcp

显示的字段:协议  Recv-Q  Send-Q  访问的本地IP   外部IP   状态    访问的进程

Recv-Q:

established状态时:表示内核空间里的socket队列还有还有多少数据没有被用户空间里的进程取走  说明应用程序非常忙,处理不过来了

listening状态时:表示多少挤压的数据在这里

Send-Q:

       establinshed:表示还有多少字节的数据没有被远程主机确认(发送出去的数据包还没有收到确认)

socket (套接字):一个程序占用IP地址的一个端口号

访问这个套接字就是访问这个程序  是Linux内核创建的

ip地址+端口号     如192.168.133:8080

把socket理解为一个空间 只要这里面有数据 就会通知应用程序来拿

两次握手是否可以?

不可以 因为包可能会丢 得不到回复 可靠性降低

三次握手封装的数据段里包括有源端口和目的端口

TCP头部封装20字节

IP包头部封装20字节

帧头部封装18字节

/etc/services:记录哪一个协议对应哪一个端口(这些端口就是熟知端口和登记的端口)

四次断开:(可以随意一方先断开  如niginx会设立一个最大连接时间)

两个的回复的seq号一样或者不一样都可以

一样的话   A只需要确认一次      不一样的话 也只需要确认后一个就好了

MSL:最大报文生成时间(最大数据传输时间),一般为2分钟(但太长了,可以定义更短一点)

TIME-WAIT:会等待两个最大数据传输时间(在先断开的那一方),理论上最长可以4分钟

为什么要等待两个时间?

因为怕网络不稳定,最后确认第四个的那个包丢了,B得不到回应,就会一直重传第三个包

Nginx服务器TIME_WAIT特别多是什么情况?

  1. 说明访问量比较大 且用户没有再发起新的请求(没有再点你的网站了,没有看了已经离开了)

(只要建立一条连接通道 无论点开多少个界面发新的请求都是这条通道)

如何尽量处理timewait过多的情况(如何让timewait等待的这段时间发挥更加哒的作用,不然就白白的在等待,浪费了时间和资源)?

让它可以处理新的连接,提升操作系统的性能

当last-ack比较多说明了什么问题?

可能有人攻击我们,变相的消耗我们的资源

TCP流控机制:滑动窗口(win)

TCP流控机制:拥塞控制

Cwnd:拥塞窗口(只是一个值),指导滑动窗口 对设置滑动窗口提供依据

拥塞窗口的值一般与滑动窗口的值相等

拥塞控制四个算法:(始终保持最多的数据在链路中传输)

  1. 慢启动
  2. 拥塞避免
  3. 拥塞发生(快重传)
  4. 快速恢复

TCP差错控制:

  1. 校验和(TCP封装里面有16位校验和):验证TCP头部是否被篡改
  2. 确认(发包一定要确认)
  3. 超时(等一段时间没确认就重传):背后需要各种计时器

计时器:

重传计时器:(为了控制丢失的数据段)

最多重传3次  然后就断开

坚持计时器:防止零窗口死锁

保活计时器:防止两个tcp之间的连接长时间的空闲

时间等待计时器(连接终止时间使用的)=2MSL

在发送了最后一个ACK后,不利己关闭连接,而是等待一段时间,保证能够接收到重复的FIN数据段

TCP的应用(DNS是UDP和TCP都支持)

UDP:

UDP的应用

UDP没有流控机制

UDP只有校验和来提供差错控制(需要上层协议也就是应用层来提供差错控制:例如TFTP协议)

标签:UDP,DNAT,端口,TCP,服务器,super,连接,端口号
来源: https://blog.csdn.net/Neptune_keke/article/details/123189763