TCP && UDP

 

TCP和UDP区别
 传输层
 

TCP: 面向连接                                                        UDP:不面向连接
        不容易丢数据                                                              速度快
        有错误报告                                                                  没有错误报告
       不易丢数据                                                                   容易丢数据
 
TCP包头结构
每一行4个字节,共5行20个字节
TCP 协议的上一层应用层/http/ssh/FTP
源端口和目的端口
游览器<------------------------------->nginx服务
这两个软件要互相发送数据,需要在数据报文里面,利用tcp协议写清楚它是http协议而不是ssh协议,http协议要区分出来需要靠端口号区分,端口号又分源端口和目标端口,源端口是指客户端的端口号,目标端口是指服务器的端口,端口号总量2^16,计算机要运行多个运用程序,每个应用程序都要有不同的端口号,服务器端的端口号是固定的。
数据偏移
指的是我们数据报文的头部,头部有可选的,我们的头部可能长过20个字节,数据偏移是指头有多长,头有多长决定了头有多少选项
六个标记位flag(标签) :
ACK(Acknowledgment/确认) SYN FIN 校验位{0或1 无用/有用}
PSH:当我们的数据报文通过网络发送到我们的网卡以后,如果我们的网卡收下来我们的数据报文,通常都是先放到网卡的缓冲区里,我们的数据报文从网络来,数据先放到缓存区里面,在把它复制到linux内核kernel,再由内核kernel交给app,PSH等于1的意思是不把数据报文放到缓冲区里等待,直接交给内核到应用程序,不放在缓冲区里,
RST:如果RST为1,表示对端的网路出现问题,主机崩溃了,立即释放链接从新开始,从新在建立连接,如果是0就是正常即可。
ack序列号 :约吗--->不约—>好吧 (seq 起始序号)+(ack 确认的序列号)
seq 起始序号
ack 确认的序列号 ,加一意思:第一个接受了,就是在发第二个数据报文

 日常查看端口命令

# ss -ntl                                   查看,打开的端口号

# lsof -i     端口号 (80)             查看80端口是否被占用

# cat  /etc/services                   定义了常用服务的端口(http,mysql,tomcat,xshell..)
 
自定义开启端口号

  yum(apt)   install -y netcat    分别是在centos(nc)和ubuntu上下载

实验要占用两个不同的主机进行试验,过程有点绕,在两个系统下都同时开两个会话窗口比较好些,不然有点不好理解

使用命令开启个端口:9888

1)第一个shell窗口,打开端口

root@ubuntu2004:~# nc  -l   9888         
2)第二个shel窗口,查看端口号

root@ubuntu2004:~# netstat  -tunp

ISHED 6137/sshd: zhu [pri
tcp 0 0 10.0.0.14:9888 10.0.0.110:58484 ESTABL

成功开启端口

注意:在开启9888 端口后只要端口被其他主机连接,端口号会自动释放,可以在重新开启

例如  

[root@centos8-2 ~]# nc 10.0.0.14 9888           10.0.0.14是Ubuntuip地址,此时已经和ubuntu建立连接,可以互相通讯,并重新开9888端口

 

系统端口号优化
#    /proc/sys/net/ipv4/ip_local_port_range                                 定义了客户端的端口范围,通常这个端口是够的
    echo1024 65535 > /proc/sys/net/ipv4/ip_local_port_range   修改客户端的访问服务器的地址范围,当在同一时间很客户能够同时进入服务器访问
 

TCP三次握手(彼此确认的过程)

这里需要注意的是SYN和ACK都是通讯的校验位{0/1},seq和ack是起始序列号,seq和ack都会累加1,可以理解为收到第一条消息,请发第二条客户端和服务器端都有自己的tcp头部的序列起始序号和确认号。

 

四次挥手
测试实例/
在在一台服务器上启动一个http服务,下台主机连接上台服务器使用telnet  10.0.0.7  80;GET  /  HTTP/2.2  ; host:1.1.1.1,wireshark抓包
首先客户端和服务端都是建立连接状态,发出分手决定有可能是服务端也有可能是客户端
前两步只是互相确认了信息,只是A到B不通讯了,不代表B不和A通讯了,这是种半连接状态,B话还没说完,B还有没有传完的数据。
maximum segment lifetime(MSL)       段的最大生存期

 2MSL (timewait)   :先发的分手未必有后发的分手快,这就造成了,先发的分手数据还没传完,卡一下后发的分手就结束了立即执行第四步,这就造成数据的丢失,为了A都能收到两条信息,更可靠所以把时间给延长等待接收时间。

三次分手出现的场景:几乎客户端和服务端同时发起分手消息,互相分手后直接进入closeing状态

测试实例

在一台服务器上启动一个http服务,再在另一台主机上curl  上台主机ip (10.0.0.7),使用wireshark抓包。

 

  TCP超时重传

当TCP报文传递过程超时,会启动其内重传定时器,进行报文重传,当对方任然没有反应时,就会达到一个规定重传次数的上限,有个上限就还有个下限。

与TCP超时重传的两个内核参数:
 /proc/sys/net/ipv4/tcp_retries1          #指定在底层ip接管之前TCP最少执行重传次数,默认值是3

/proc/sys/net/ipv4/tcp_retries2           #指定连接放弃前TCP最多可以执行的重传次数,默认值15(一般对应13~30min)

          

UDP(User Datagram  Protocol)

udp包头

 

网络层(internet)

ICMP协议判断网络状态(destination/送达地点   unreachable/不可达)

例如: win    ping    www.baidu.com  -t

            linux  ping   www.baidu.com

1)设置一个ping不通的实战环境,一台服务端,一台客户端,一台提前阻止另一台ping自己,另一台区ping前一台,没有输出结果

# -A                               追加到链接(Append to chain)

#  -j                                加载目标扩展(load target extension)

#  -s                               address

[root@MiniCentOS8 ~]#    iptables -A INPUT -s 10.0.0.14 -j DROP    

    root@ubuntu2004:~#     ping 10.0.0.159

2)删除路由表后查看网络联通情况,ping百度时不通

#  ip route        查看路由

#  default          默认

#  route             路由

#  del                 删除

#  add                增加

root@ubuntu2004 ~#   ip route

root@ubuntu2004:~#   iproute del default via 10.0.0.2 dev ens33 proto static 

root@ubuntu2004:~#   ping www.baidu.com

root@ubuntu2004:~#   iproute add default via 10.0.0.2 dev ens33 proto static 

3)查看是不是网线断了,导致ping命令使用的imcp报文不通,正常连接状态如下图2

root@ubuntu2004:~# mii-tool ens33
ens33: negotiated 1000baseT-FD flow-control, link ok

4)线路出现问题把线路连接到两个交换机的两个头上,导致环路,广播一直回环,消耗带宽,网络就瘫掉了,一般交换机都有stp协议来解决环路问题

 总结:icmp是属于internet层较上的层,ping命令是属于icmp协议类型进行数据交换的

ARP 通过ip地址解析mac地址,通过交换机找到对应主机(地址解析协议)

#  arp    -n           查看通讯过主机ip和本身的mac地址对应关系

#  -nn                   以数字化模式读去

#   -i                       interface 网卡接口

#   -s                     设置一个新的arp关系(set a new ARP entry)

 注意:当本地主机需要和远程主机通讯的时候,第一步先查缓存,缓存里有mac地址就直接通讯,如果没有就通过arp广播,当然本地主机过一段时间不和远程主机通讯,里面的缓存将会失效,缓存的有效期到了,缓存里的mac信息将会删除。(一问一答的工作逻辑,你发问,我回答,你就信,这使arp通讯很不安全,容易造成arp欺骗

通过抓包来更深入了解arp的沟通过程(tcpdump/抓包命令)

 [root@centos8-2 ~]#   tcpdump -i ens33 -nn arp

root@ubuntu2004:~#   ping 10.0.0.110 -c1

12:32:35.719706 ARP, Request who-has 10.0.0.14 (00:0c:29:60:9a:5f) tell 10.0.0.3, length 46
12:32:35.719761 ARP, Reply 10.0.0.14 is-at 00:0c:29:60:9a:5f, length 46

解决缓存一定时间后消失,ip又要重新发arp广播通过找mac的过程,防止有黑客窃取数据,现在就可以绑定ip和mac地址的关系,只要不关机就一直存在,从而实现静态绑定

[root@centos8-2 ~]# arp -s 10.0.0.14   00:0c:29:60:9a:5f

[root@centos8-2 ~]# arp -n
10.0.0.14                ether   00:0c:29:60:9a:5f   CM 

arp欺骗:

 

Gratuitous  ARP (免费arp,它可以避免地址冲突)

当服务器启动的时候或这网卡启动的时候,服务器会向网络中发送报文,说网络中谁拥有这个地址10.0.0.110,如果网络中有人在用这个地址,它就会回答这个请求,我服务器收到了网络中也有人在用自己的地址,发现网络中有地址冲突了,linux系统会自动禁用地址不让它生效了,如果网络中发了几次没人理,然后服务器就发一个自问自答的包,对外宣称我拥有这个地址,这就是免费arp的逻辑

# label              标签

# add                增加

# duplicate       完全一样

测试地址冲突,给一台主机增加另一台主机的地址,在从第三台主机上使用arping命令就可以发现有两个mac地址用的都是10.0.0.110的地址,首先要在服务器上下载arping包(apt/yum install iputils-arping)

                                     增加一个主机地址:

[root@centos7_2009 ~]#  ip a add(del/删除) 10.0.0.110/24 dev  ens33  label  ens33:1

                   root@zhu:~#     arping 10.0.0.110

Unicast reply from 10.0.0.110 [00:0C:29:57:45:DA]  2.595ms
Unicast reply from 10.0.0.110 [00:0C:29:A2:11:8C]  4.165ms

使用wireshark抓包,确定已经被占用

如果两台主机故意配置同样的地址,但又不产生冲突,可以使用Gratuitous arp技术,跨网段通讯,需要用arp技术不断的跨路由进行连接。

 

Internet协议

 

# 版本                       4个位,局域网一般使用的都是ipv4 ,互联网现在好多都是ipv6版本

# 源地址/目的地址    32个位,可以算出ipv4的地址有2^32=43亿个ip地址

#  标识                       一个大的段,需要切成小包,切除三个包,三个包都是一个标识切出来的,所以标识要一样,一样表示是同一大端的小包

#  标志                       表示是切片包还不是切片包,是头切片包还不是头切片包

#  片偏移                    是大包里的第几个包(ttl/生命期)

ttl                            linux和win的初始ttl不同,linux是128,是以进过路由器的数量为单位,每经过一个路由器就减一,为0数据包就生命终止了  

# 协议                          上层协议 tcp/udp/icmp

 

打开网站经历了什么:首先是建立连接要使用tcp协议,怎们建立tcp协议了,那就先要使用arp协议发广播(broadcast)找到目标的物理地址mac ,广播通过路由发送到目标主机,目标主机收到回应,然后目标的mac和IP就写到包的源地址中,通过tcp报文传给宿主机,宿主机就把包里的地址和ip写到arp缓存表里,要实现持久缓存的话就需要执行命令arp -s  ip  mac    固定到缓存表中。

 

IP地址的组成

IP地址=网络ID (同一网络里网络id相同)+ 主机ID(主机id不同)

MAC=厂商ID(固定)+设备iD(自定义)

网络ID:主机在哪个网段,每个网段有自己的编号,叫网络ID,同一网段网路ID相同

主机ID:一个网段里的每个主机都是有唯一的标志的

主机id全为0:代表这个网络的名字

主机id全为1:代表是这个网络的广播

A类id:           最高位为0

主机数(主机id不同)=2^24 - 2 =1600万

网络数(0/127是特殊id)=2^7

 

地址分类

A    0(未知地址,不能用),127给每个主机的回环网卡保留了不能用

       网络ID是前8位,主机ID的是后24位(bit/字节) 

       网络数=127

       主机数=2^24 -2

        1-126位A类地址

         netmask=255.0.0.0       前八位十网络id

B

       前两位是01不变

       网络ID是前16位,主机ID的是后16位(bit/字节)

       网络id数=2^14

       主机数=2^16 - 2

             前两位是01不变

                 01/1111111   最大191

                 01/000000   最小128 

        128 - 191

         netmask=255.255.0.0        网络ID是前16位

C

      前三位是110不变

      网络ID是前24位,主机ID的是后8位(bit/字节)

      网络id数=2^21

      主机数=2^8 - 2=254

            前三位是110不变    

                110/10000   最小192

                110/111111   最大223

       192 - 223   

        netmask=255.255.255.0           网络ID是前24位    

      多播地址没有网络和主机ID

       前四位是1110不变

        224-239

E    保留(研究使用)

      240- 

 

无类技术:不分类,网络ID不固定,按需指定,产生了子网掩码

nermask:子网掩码  32bit二进制,和IP成对使用,对应于IP中网络id为1,对应于主机id为0

                  255.255.0.0     16位网络id,和16位主机id,连续的0和连续的1

00000000    0

10000000    128

11000000     192

11100000      224

11110000       240

11111000        248

11111100         252

11111110         254

11111111          255   

主机数=2^主机id - 2

网络数=2^可变网络ID

网络ID=ip与netmask

CIDR:无类域间路由

  IP                    /   网络ID位数    

 

10.0.0.123            /       12           

10.0.0.123/12 

255.240.0.0        8个一 +  4个一  = 12

1)测试

   IP          =  202.100.200.66/20                 

   netmask=  255.255.240.0     

IP               11001001   1100100        11001000        1000010

netmask     111111111   111111111      11110000         00000000

网络iD             202             100           11000000/192            0           

       主机数=2^(32-20)  - 2   = 4094     

       网络数=2^20

       netmask=  255.255.240.0     

       网络ID=     202 .100.192.0

2)测试

203.101.234.163/26                      10100011     

netmask=255.255.255.192            11000000

主机数=2^(32-26) - 2 = 62

网络数2^26 

网路id=203.101.234.128

3)测试

a:10.0.1.1/24      10.0.1.0                   

b:   10.0.2.2/24|16      10.0.2.0         

                                                          

判段是否在同一网段,那本机的子网掩码和对方的IP相与

 A---->B    a通讯b,拿a的子网掩码与

a网络id= 10.0.1.0

b网路id=  10.0.2.0        主机id10.0.2.2与255.255.255.0

B--->A    b通讯a,拿b的子网掩码与

b网路id=10.0.0.0

a网路id=10.0.0.0          主机id10.0.1.1与255.255.0.0

 

公共和私有地址

 B类中有shi

 

公共IP地址:互联网上设备拥有的唯一地址

 

 

 

网络配置命令

静态指定:

ifconfig ,route,netstat

ip:object{link,addr,route},ss,tc

system-config-network-tui,setup

配置文件

#  configurration  配置

#  dynamic           动态

#   host                 宿主机

动态分配:DHCP

ifconfig命令(显示和禁用网卡)

obsolete    被淘汰的

#   MTU          以太网帧的最大值,最大传输单元MTU,帧大小最大为1500,lo回环网卡的,不是正真的网卡

# RX-OK      接收ok

# RX-ERR   出错的

# RX-DRP   被抛弃

# RX-OVR   超载的

来自于net-tools包,可以使用ip代替

#  ifconfig ens37 down  禁用网卡

#  ifconfig ens37  up      禁用网卡

#  ifconfig  ens37  192.168.10.100/24                修改网卡的地址

 ifconfig  ens37:{1..9}  192.168.10.100/24      增加网卡地址

#  ifconfig ens37:1  down                             停用网卡地址

#  ifconfig   ens37       0                             删除网卡信息

#  ifconfig  -s  eth0/ens33                             统计网卡流量

优化ping,防止被攻击  

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all     输入1后网络流量会变慢

查看流量

ping 10.0.0.110 -f                             flood如同洪水般的ping,查看网卡的吞吐量

watch -n 0.5 ifconfig -s ens33         每隔0.5秒执行一次

 

 

route  命令 (网络路由)

# Destination       目标地

# Metric               费用,值小的优先级越高走

# route  -n           查看路由表

# iface                  接口

目标destination加子网掩码genmask,描述了目标网络怎么走 

 

route record   路由记录

网络路由:表示一个网段的路由

主机路由:表示一个主机的路由

默认路由:表示一个未知网段的路由  0.0.0.0/0

路由表组成(增加网卡,在仅主机的模式下。相当于连到一个交换机hub上)

目标网络

netmask

接口:当前路由的出口,当前主机的接口

网关:下一个路由器的ip 

路由增删改配置

增加一个主机地址:
ip a add(del/删除) 10.0.0.110/24 dev ens33 label ens33:1
ifconfig ens37:1 10.0.0.9/24
绑定mac和IP对应关系
arp -s 10.0.0.14 00:0c:29:60:9a:5f
增加删除路由表
ip route
iproute add default via 10.0.0.2 dev ens33 proto static 增加
iproute del default via 10.0.0.2 dev ens33 proto static 删除
修改网卡的地址
ifconfig ens37 192.168.10.100/24
增加主机地址
ifconfig ens37:1 10.0.0.9
删除增加的主机地址
ifconfig ens37:1 down
# ifconfig ens37 192.168.10.100/24             修改网卡的地址
# ifconfig ens37:{1..9} 192.168.10.100/24      增加网卡地址
# ifconfig ens37:1 down                        停用网卡地址
# ifconfig ens37 0                             删除网卡信息

 

删除路由表
route del -net 192.168.10.151 dev ens33
route del default(-net 0.0.0.0/0) gw 10.0.0.2   删除默认网关
添加共同的路由
route add -net 192.168.10.0/24 dev ens37
添加路由(逻辑上不在一个网段,物理上在一个网段)
ifconfig ens37 1.1.1.1/24 centos7
ifconfig ens37 2.2.2.2/24 centos8 
route add default gw 10.0.0.2 dev ens37 proto static 添加默认路由(centos7/8)
 
添加指定的网关
# default 默认值
# via 经由
# dev 输入设备
# proto 原型
# route add default gw 10.0.0.2 添加默认网关
# ip route add default via 192.168.10.254 dev eth0 proto static

linux成为交换机,启用ip_forward转发的作用
# echo 1 > /proc/sys/net/ipv4/ip_forward mtr 地址 # 跟踪路由
生效修改后网卡
# 使修改网卡生效                       centos7
systemctl restart network     
# 使修改网卡生效                        centos8
nmcli  connection  reload 
nmcli  connection up  eth0
nmcli  connection up  eth1
#  使修改网卡生效                        ubuntu
netplan apply
 
# ubuntu网卡修改配置文件
/etc/netplan/*.yaml #名称必须以yaml后缀,点.前面的名字无所谓,并且yaml文件必须放在/etc/netplan文件里
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
      - 172.16.0.200/16
      gateway4: 172.16.0.254
      nameservers:
        addresses: [ 180.76.76.76, 223.6.6.6]
 
# centos网卡修改配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0 #ifcfg不能改变,后面eth0可以随意改abc,文件名叫什么都行
DEVICE=eth0                       #设备装置名
NAME=eth0                         #描述可写可不写
BOOTPROTO=none(static)            #网卡的地址none(static)/静态  dhcp/自动 
IPADDR=10.0.0.7                   #IPv4地址
PREFIX=24                         #子网掩码一种写法   PREFIX=24    另种写法  NETMASKE=255.255.255.0
GATEWAY=10.0.0.2                  #网关 
DNS1=223.6.6.6                    #域名解析 
DNS2=180.76.76.76

 

 

posted @ 2020-12-30 22:03  Jackiezhu  阅读(138)  评论(0)    收藏  举报