TCP/IP 知识点

tcp/ip 知识点

tcp-1

linux 简单的命令访问网站并返回http数据包信息示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# 建立一个非 浏览器 的 http 连接并读取返回信息
exec 8<> /dev/tcp/www.baidu.com/80
echo -e 'GET / HTTP/1.0\n' 1>& 8
cat <&8

获取到baidu HTTP协议返回信息


# linux 进程打开 socket/inode等文件描述(本质:文件系统)
[root@master1 fd]# ps -ef| grep kubelet
root 1538 1513 2 Jun22 ? 1-20:53:43 kube-apiserver --advertise-address=10.33.41.132 --allow-privileged=true --authentication-token-webhook-config-file=/etc/kubernetes/configs/authwebhookconfig.yaml --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --event-ttl=12h --feature-gates=TaintBasedEvictions=false,TTLAfterFinished=true --insecure-port=0 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --service-node-port-range=30000-32767 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 --tls-min-version=VersionTLS12 --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
root 6914 1 3 Jun22 ? 2-05:27:31 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=systemd --dynamic-config-dir=/var/lib/kubelet/dynamic --network-plugin=cni --node-ip=10.33.41.132 --pod-infra-container-image=docker.hikcloud:30001/k8ss/pause:3.1 --root-dir=/var/lib/kubelet
root 31042 16717 0 10:35 pts/1 00:00:00 grep --color=auto kubelet
[root@master1 fd]# cd /proc/6914/fd
[root@master1 fd]# ls -l
total 0
lr-x------ 1 root root 64 Aug 31 10:08 0 -> /dev/null
lrwx------ 1 root root 64 Aug 31 10:08 1 -> socket:[123625]
l-wx------ 1 root root 64 Aug 31 10:08 10 -> pipe:[125488]
lrwx------ 1 root root 64 Aug 31 10:08 11 -> socket:[124397]
lrwx------ 1 root root 64 Aug 31 10:08 12 -> socket:[124404]
lrwx------ 1 root root 64 Aug 31 10:08 13 -> socket:[169557354]
lrwx------ 1 root root 64 Aug 31 10:08 14 -> socket:[125570]
lr-x------ 1 root root 64 Aug 31 10:08 15 -> anon_inode:inotify
lrwx------ 1 root root 64 Aug 31 10:08 16 -> socket:[230272123]
lrwx------ 1 root root 64 Aug 31 10:08 17 -> socket:[125528]
lrwx------ 1 root root 64 Aug 31 10:08 18 -> socket:[125529]
lrwx------ 1 root root 64 Aug 31 10:08 19 -> socket:[122620]
lrwx------ 1 root root 64 Aug 31 10:08 2 -> socket:[123625]
lrwx------ 1 root root 64 Aug 31 10:08 20 -> socket:[122621]
lr-x------ 1 root root 64 Aug 31 10:08 21 -> anon_inode:inotify
lrwx------ 1 root root 64 Aug 31 10:08 22 -> anon_inode:[eventpoll]


# 查看相关文件描述符
[root@master1 fd]# lsof -p 6914
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kubelet 6914 root cwd DIR 254,0 224 64 /
kubelet 6914 root rtd DIR 254,0 224 64 /
kubelet 6914 root txt REG 254,0 111568408 403332145 /usr/bin/kubelet
kubelet 6914 root mem REG 254,0 61624 36683 /usr/lib64/libnss_files-2.17.so
kubelet 6914 root mem REG 254,0 2151672 36665 /usr/lib64/libc-2.17.so
kubelet 6914 root mem REG 254,0 19288 36671 /usr/lib64/libdl-2.17.so
kubelet 6914 root mem REG 254,0 141968 36691 /usr/lib64/libpthread-2.17.so
kubelet 6914 root mem REG 254,0 163400 36658 /usr/lib64/ld-2.17.so
kubelet 6914 root 0r CHR 1,3 0t0 6352 /dev/null
kubelet 6914 root 1u unix 0xffff88c912dbd400 0t0 123625 socket
kubelet 6914 root 2u unix 0xffff88c912dbd400 0t0 123625 socket
kubelet 6914 root 3u unix 0xffff88ca94f53c00 0t0 124265 @00071
kubelet 6914 root 4u a_inode 0,10 0 6348 [eventpoll]
kubelet 6914 root 5u unix 0xffff88c8f5b23800 0t0 122558 socket
kubelet 6914 root 6r a_inode 0,10 0 6348 inotify
kubelet 6914 root 7u unix 0xffff88cac1311000 0t0 123654 socket
kubelet 6914 root 8u a_inode 0,10 0 6348 [eventpoll]
kubelet 6914 root 9r FIFO 0,9 0t0 125488 pipe
kubelet 6914 root 10w FIFO 0,9 0t0 125488 pipe
kubelet 6914 root 11u unix 0xffff88ca94f51800 0t0 124397 /var/run/387454838
kubelet 6914 root 12u IPv4 124404 0t0 TCP localhost:42420 (LISTEN)
kubelet 6914 root 13u IPv6 169557354 0t0 TCP master1:10250->master3:64790 (ESTABLISHED)
kubelet 6914 root 14u unix 0xffff88cac1310800 0t0 125570 socket
kubelet 6914 root 15r a_inode 0,10 0 6348 inotify
kubelet 6914 root 16u unix 0xffff88c91a133000 0t0 230272123 socket
kubelet 6914 root 17u unix 0xffff88c93dcb8c00 0t0 125528 socket
kubelet 6914 root 18u unix 0xffff88ca93e43800 0t0 125529 socket
kubelet 6914 root 19u unix 0xffff88c93dcbb800 0t0 122620 /var/run/387454838
kubelet 6914 root 20u unix 0xffff88ca93e40c00 0t0 122621 /var/run/387454838
kubelet 6914 root 21r a_inode 0,10 0 6348 inotify
kubelet 6914 root 22u a_inode 0,10 0 6348 [eventpoll]
kubelet 6914 root 23r FIFO 0,9 0t0 125542 pipe
kubelet 6914 root 24w FIFO 0,9 0t0 125542 pipe
kubelet 6914 root 25r CHR 1,11 0t0 6358 /dev/kmsg
kubelet 6914 root 26u IPv6 124463 0t0 TCP *:10250 (LISTEN)
kubelet 6914 root 27u unix 0xffff88caebebd800 0t0 125589 /var/lib/kubelet/device-plugins/kubelet.sock
kubelet 6914 root 28u unix 0xffff88cac1313c00 0t0 125549 /var/lib/kubelet/pod-resources/283926109
kubelet 6914 root 29u IPv4 125551 0t0 TCP localhost:10248 (LISTEN)
kubelet 6914 root 30u unix 0xffff88ca83a21400 0t0 229931580 socket
kubelet 6914 root 31r a_inode 0,10 0 6348 inotify
kubelet 6914 root 33r CHR 1,11 0t0 6358 /dev/kmsg
kubelet 6914 root 34r a_inode 0,10 0 6348 inotify
kubelet 6914 root 35u a_inode 0,10 0 6348 [eventpoll]
kubelet 6914 root 36r FIFO 0,9 0t0 125593 pipe
kubelet 6914 root 37w FIFO 0,9 0t0 125593 pipe
kubelet 6914 root 38u unix 0xffff88cac1386000 0t0 124529 socket
kubelet 6914 root 39u unix 0xffff88caf6d00c00 0t0 123724 socket
kubelet 6914 root 43u IPv4 168915864 0t0 TCP kubernetes.cluster.local.lb:38676->kubernetes.cluster.local.lb:16443 (ESTABLISHED)
  • fd ——> 文件描述符(变量)

传输控制层

tcp-2

tcp/udp(传输控制层)

上面网络层为应用层,应用层基于 传输控制层 建立的连接,来进行数据传输

!连接是什么?连接如何建立?

tcp-3

连接,就是双方都有资源,能够为双方的应用提供服务,进行数据传输。

tcp/udp连接,虚拟概念,底层由内核文件系统 + 数据io + 更底层网络协议实现


tcp:面向连接可靠的传输协议

  • 建立连接:

三次握手:client 发出 syn —— server 返回 syn + ack —— client发出 ack ——>

  • 数据传输:

client & server 申请一定资源,建立连接通信进行数据传输 ——>

  • 断开连接:

四次分手:双方socket资源释放

client 发出fin—— server 返回 fin + ack—— server发出 fin —— client发出 ack。(到此结束)

!三次握手、四次分手过程中,发出的信号包(例如ack确认),长度都为 0

tcp-4

socket ——> [client ip:client port -> server-ip:server port] 四元组

不同ip服务器同个端口,均可以建立 65535 个连接

tcp-5


查看操作系统网络状态 netstat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
netstat -natp

# 示例
[root@master1 ~]# netstat -natp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:10259 0.0.0.0:* LISTEN 26858/kube-schedule
tcp 0 0 127.0.0.1:42420 0.0.0.0:* LISTEN 6914/kubelet
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3365/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3862/master
tcp 0 0 0.0.0.0:16443 0.0.0.0:* LISTEN 28115/haproxy
tcp 0 0 127.0.0.1:9182 0.0.0.0:* LISTEN 11322/./bin/k8s-key
tcp 0 0 0.0.0.0:9119 0.0.0.0:* LISTEN 28115/haproxy
tcp 0 0 0.0.0.0:8067 0.0.0.0:* LISTEN 28115/haproxy
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 6914/kubelet
tcp 0 0 0.0.0.0:8073 0.0.0.0:* LISTEN 28115/haproxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 2848/kube-proxy
tcp 0 0 0.0.0.0:8074 0.0.0.0:* LISTEN 28115/haproxy
tcp 0 0 127.0.0.1:2381 0.0.0.0:* LISTEN 1576/etcd
tcp 0 0 127.0.0.1:10257 0.0.0.0:* LISTEN 26883/kube-controll
tcp 0 0 0.0.0.0:30001 0.0.0.0:* LISTEN 28115/haproxy
tcp 0 0 127.0.0.1:46448 127.0.0.1:9180 TIME_WAIT -
tcp 0 0 127.0.0.1:46816 127.0.0.1:9180 TIME_WAIT -
tcp 0 0 127.0.0.1:45914 127.0.0.1:9180 TIME_WAIT -
tcp 0 0 127.0.0.1:2381 127.0.0.1:41694 TIME_WAIT -
tcp 0 0 127.0.0.1:46886 127.0.0.1:9180 TIME_WAIT -
tcp 0 0 127.0.0.1:57580 127.0.0.1:2379 ESTABLISHED 1538/kube-apiserver
tcp 0 0 127.0.0.1:57478 127.0.0.1:2379 ESTABLISHED 1538/kube-apiserver
tcp 0 0 127.0.0.1:57594 127.0.0.1:2379 ESTABLISHED 1538/kube-apiserver

在 tcp/udp 连接的传输过程中,任何一方发出 数据包,另一方都要发出 ack 确认动作

tcp-6

1
tcpdump -i (设备名) nn(非机密信息掩饰) port (端口) -X(可选,是否查看数据包内具体内容)

tcp-7


nc程序,可以与指定 ip + port 建立连接。nc客户端执行 get、post、put请求。四次分手,可以 FIN和ACK包一起发,只需要3次

建立连接过程中,tcp/udp连接建立会带有 ? 因为数据包的收发还依赖底层(网络层[数据包收发形式])


网络层

  • IP

  • route

互联网(很多小的网络互相连接起来),主机IP访问(网络号+主机位)

/etc/sysconfig/network-scripts/ifcfg-eth0

IPADDR ip地址

NETMASK 掩码

GATEWAY 网关

DNS 域名解析服务器

IP + NETMASK 与运算,得到——网络号

路由表

查看路由表

GATEWAY 0.0.0.0,即不需要 走 路由器/网关(即无需下一跳),网络直连,直接与同网段 ip 节点互相通信

1
2
3
4
5
6
7
8
9
10
11
12
[root@master1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.33.41.254 0.0.0.0 UG 0 0 0 eth0
10.33.41.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.244.0.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.244.1.0 10.244.1.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.5.0 10.244.5.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.6.0 10.244.6.0 255.255.255.0 UG 0 0 0 flannel.1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0

路由表

作用:

记录当前局域网(局部互联网)所有的连接信息,为 网络路由(网关节点、路由器、流量发出节点) 提供下一跳的 依据

原理:

网络中下一跳点,必有流量入口,另外一个流量出口

举例:

发送给百度数据包。(本机ip 192.168.150.2,百度ip 61.135.169.121),对于发送到外部网络的流量

通过 Genmask 掩码进行与运算匹配

1)255.255.255.0 计算后 得到 目标地址:192.168.150.0 为当前网络段,网络直连。

2)0.0.0.0 计算后 得到 0.0.0.0,即目标地址为 0.0.0.0,走到网关 192.168.150.0,由网关/路由器所在节点决定网络下一跳。

Iface 设备 流量出入,走到 网关/路由器所在节点,决定下一跳地址。

此时发送的目标地址为 61.135.169.121,为了保证这个数据包能够发送到 网关节点,需要为数据包的 目的地址、端口 提供 额外地址信息,即网关/路由器 节点的 MAC 地址(即链路层协议在 网络层数据包外 添加 自身数据包 封装)

数据包发到 服务端,根据 目的ip 发送到指定处理的节点,根据 目标端口,查找在服务器上的对应进程,并进行 数据处理,实现 进程与进程间网络通信。

tcp-8


链路层

链路层地址数据库维护

查看该数据库 arp -a

1
2
3
4
5
6
7
8
9
10
[root@master1 ~]# arp -a
? (172.17.0.2) at 02:42:ac:11:00:02 [ether] on docker0
node1 (10.33.41.135) at fa:16:3e:99:4b:46 [ether] on eth0
kubernetes.cluster.local.lb (10.33.41.130) at <incomplete> on eth0
? (10.33.41.250) at 50:98:b8:19:af:1f [ether] on eth0
node2 (10.33.41.136) at fa:16:3e:8f:eb:a6 [ether] on eth0
? (10.33.41.131) at e8:61:1f:21:87:c9 [ether] on eth0
? (10.33.41.251) at 74:ea:cb:2d:cd:68 [ether] on eth0
master1 (10.33.41.126) at fa:16:3e:8f:eb:a6 [ether] on eth0
? (10.33.41.137) at fa:16:3e:1a:2e:f3 [ether] on eth0

找到 目标设备网卡的 MAC 地址。

tcp-9

例如,访问 www.baidu.com

从 client端发起网络请求,请求数据包—— 百度服务器的IP地址和 (家内/小区内)路由器 的 MAC 地址

中间路由器——将请求数据包( 目标ip、端口不变,修改目标MAC地址)

中间服务器到百度服务器——百度服务器ip地址和端口 & 百度服务器MAC地址

类似链表结构(每次原数据不变化,跳转地址变化)


ip 路由表 本身可以有记录(系统启动时,读取网卡配置项即可)

路由表信息——也称 静态路由。

1
网关代表下一跳! Next Jump

arp mac相关地址信息无记录,必须通过网络请求后,请求完成后添加、更新记录。

即,第一次发出数据包/网络请求时,arp会请求 目标ip节点 的 MAC 地址。

问题?当arp申请mac地址时,它不知道目标 ip的 mac 地址,如何将包发给正确 mac 地址,然后申请获得目标ip的 mac信息呢?

—— arp会广播给局域网所有节点(广播MAC地址为 全 ff 的MAC 地址),仅目标 ip 的 mac 会响应,以此发现目标ip的mac地址

所以,为什么网络是分层的?

层和层之间有依赖关系。

!!!

因此,第一次建立连接前,即三次握手前,需要 发出 arp 请求,获取目标MAC地址

获取到MAC地址后,才开始 三次握手 等 tcp/ip 层网络连接

示例命令:

1
arp -d 192.168.150.2 && curl www.baidu.com
tcp-10

tcp-11

网络方面,-n / -nn 为是否展示详细信息


tcp-12

回环设备——Loop Device

路由表规划不对,需要网工(人为维护)——SDN的源头

tcp-13

tcp-14

有了网络知识,才能入坑并发时,socket处理,以及并行度相关知识

网络——》并发——》并行度


交换机、路由器、网关的关系?

路由器:三层设备,存有路由表,看IP地址

交换机:二层设备,物理层/链路层,看MAC地址,不能作为两个网络区域 连接的使用

家用路由器:交换机+路由器结合,四个插口为交换机口;路由器接两条线,一条接交换机、一条接ISP运营商

NAT:地址转换协议


高薪程序员:M+N(内在和外在兼修)

M:个人修行

设计模式

多线程 + 高并发 JUC

网络到分布式:redis、zookeeper、elasticsearch、mq

调优:OSKernel

N:项目经验,即场景

整合《——》技术《——》问题

技术:落地到应用场景


一个问题:技术选项——技术特征、原理、源码、!场景!


整合一些技术,再解决问题。——结合点


在实际工作中 辩证 实践验证技术特征、能力。

例如 ssm,需要高并发,引入负载均衡(lvs)