为什么要有多层?分层解耦
结构
OSI七层(参考模型)

- 应用层:用户接口,浏览器(与人交互)、tomcat(独立在后台运行对外提供服务)
- 表示层:协议、语义、段落的划分、字符串的表示、加密
- 会话层:session等
- 传输控制层:如何建立连接
- 网络层:如何路由
- 链路层:点与点之间的通信
- 物理层:wifi、光纤
TPC/IP体系
总结:TCP/IP协议基于下一跳的机制,IP是端点间,mac地址是节点间的
是OSI方案的具体方案,会话和表示被放入应用层

- 应用层:HTTP协议,ssh协议,smtp(发邮件)
演示:我们可以看到,第一步要建立连接,第二步传送数据(http协议)
cd /proc/$$/fd #到当前进程的文件描述符路径
exec 8<> /dev/tcp/www.baidu.com/80 # 生成新的文件描述符8,并且输入输出都指向它<>,一切及文件。我们ll会看到对应了socket建立了连接
echo -e 'GET / HTTP/1.0\n' >& 8 # echo打印,-e会识别\n为换行符,''里面是HTTP规定request请求头(get方法 / url资源 HTTP协议版本)>&重定向到8
cat 0<& 8 # 标准输入0来自于文件描述符8。打开Network、找到baidu、Headers、Request Headers(view source)
exec 8<& - # 如果连接时间太长,会Connection reset,这里关掉一下重来
- 传输控制层:TCP、UDP
- 浏览器调用传输控制层,建立socket,是计算机内核的工作。应用层需要等待传输控制层建立连接(所以这里有阻塞)
- 应用无关
2.1 TCP:面向连接的(确认过眼神),可靠的协议 - 三次握手:站在方法和IO的角度来看
- 客户端发送握手(一)(SYN),服务端发送确认(二)(ACK),此时对于客户端已经满足input和output
- 客户端返回给服务端(三)(ACK)。(这里是可以做数据的粘连的,ACK的时候顺带了数据)
- 三次握手完成后,双方开始在内存开辟线程、对象、描述符和所有资源(产生资源的消耗),tomcat或者JVM拿到了IO,才能开始往里面写数据。也就是说这是内核态的来挥发建立连接,此时没有应用层数据相关的内容。
- TCP必然是发送完,对端必然给一个确认,此确认机制保证了可靠的传输机制。
- 四次挥手
- socket资源是有限的,65535个(作为服务端只要一个端口即可别的都可以来连它,作为客户端寻求连接连一个就用一个),用完就不能建立别的连接了。
- 首先例如客户端先发送断开连接的请求(一),由于TCP是一种可靠的传输机制,服务端必须马上回复ACK(二)
- 此时客户端不能马上销毁数据断开连接,要做后续的处理,也就是说断开必须是双方主动都提出的。
- 服务端可能会要传输一部分数据,也可能不传,但都需要发送一个断开连接的请求(三),并且获得来自客户端的确认(四)。此后双方可以各自在内存中销毁数据断开连接。
- 重要结论:三次握手+数据传输+四次挥手,是最小粒度不可分割。比如一个客户端和两个服务端,必须要两组粒度,否则不可能建立完整的通信。
- 传输控制层的表格
$ netstat -natp #n(ip地址不要以逻辑名称显示)、a(所有)、t(tcp)、p(pid显示进程号)
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:10056 0.0.0.0:* LISTEN 123/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 456/sshd
# 这里socket就是本地和对端ip port,唯一
- 网络层(路由条目的判定,找到下一跳)
上面的传输控制层准备握手就阻塞了,要调用网络层梳理清楚网络
以下开始,先了解以下概念:
cat /etc/sysconfig/network-scripts/ifcfg-eth0 # interface config 网卡ethernet 0号网卡
# 可以看到IPADDR(ip地址,点分字节)、NETMASK(掩码)、GATEWAY(网关)、DNS
# ip地址和掩码做与运算就是网络号(前面几位),剩下的是主机号
网络层的表
route -n # 路由表,目标地址和掩码进行与运算,如果找不到就是到默认网关,如果找到网关就是0.0.0.0
- 链路层(通过arp协议,有了mac地址)
知道下一跳去哪里,上一层找到了默认网关的ip,但是数据包里是目标ip没法放ip了,所以加一层MAC地址表示下一跳的地址
arp -a # 解析ip地址和网卡硬件地址的映射。DNS是全网的,arp是局域网的
# 1. 在计算机刚刚开机的时候,arp表格是空的,为了方便发包出去,目标mac地址FFFFFFF,目标ip 192.168.1.1(路由器),先发出去
# 2. 在交换器如果发现mac地址是FFFFFFF,则会进行广播(别的局域网的计算机、以及路由器)
# 3. 普通计算机会丢弃,但路由器接受到发现来的包是arp包,就会将自己的mac地址包发回去
# 4. 交换机有学习功能,第一次看到mac地址会进行记录(端口号:mac的映射),第二次(也就是路由器返回这一次)会直接转发回计算机,由此计算机获得了arp表
- 物理层
网卡,二进制编码,(开始发握手包)
结论
所以我们知道地址包含(由外到内):MAC地址、ip地址、port号(进程)
客户端:应用层(HTTP/SSH/STMP)、传输控制层(TCP UDP)、网络层(路由表、下一跳)、链路层(arp表得到mac地址)、物理层(网卡、二进制编码)
交换机:链路层、物理层(接同一网络)
路由器:网络层、链路层、物理层(衔接不同网络)
网友评论