一、7L参考模型
7、应用层 -> 7 +表示层 -> 6(nginx软件)
协议:http、ssh、smtp
http:字符串的书写格式、表现形式,以及两端方法的交互方式。
作用:只负责字符串的封装(GET /)
4、会话层 -> 5 + 传输控制层 -> 4(LVS)
协议:tcp(面向连接的、可靠的)、udp(不是面向连接的、不可靠的)
IP:PROT-IP:PORT表格:
netstat -anp(a:显示所有 n:使用ip p:显示PID和程序名称)
说明:本地IP地址是192.168.217.11,端口是22,远程地址是192.168.217.1,每打开一个窗口,会从65535个端口中申请一个端随机端口来映射这个打开的窗口。三个窗口刚好映射三条记录,sshd(ssh deamon)是一个守护进程。当我们请求百度时,百度也会有这样一张IP:PROT-IP:PORT表来映射用户的请求,所以每个用户的操作是不影响的。
怎么获得连接?(三次握手)
创建一个连接数据包,客户端发送一个连接包(sync)给服务端,服务端响应一个包给客户端(sync + ack),最后客户端也响应一个包(ack)给服务端,建立连接,开辟线程,开辟资源占用。
为什么要三次握手?
tcp最关键是面向状态,客户端和服务端的状态要保持一致,才能传输,客户端向服务端发送得到回应,服务端向客户端发送一个包,最后也得到回应。
怎么断开连接?(四次分手)
客户端想断开连接,发送一个确认包(fin),服务端回应ok;然后服务端发送一个确认包(fin),客户端回应ok,最后连接断开,释放资源。
为什么要断开连接?
socket建立连接时,需要一个端口号,一个操作系统的端口号一共65535个。端口如果不资源回收,端口就会占用完。
为什么三次握手和四次分手是一个原子操作?
如果做负载均衡,客户端和服务器A完成了两次握手,将ack响应给了服务器B,那连接无法建立,无法开辟资源。
3、网络层
协议:ip、icmp
ip:是逻辑、可变的,用来寻址。ip地址点分字节,一个点分一个字节,一个字节八位,有0是0,全1是255,是一个范围。
netmask:划分网段,类似国家、省市区。
gateway:网关
dns:域名解析
网络号:ip与netmask进行按位与运算,192.168.217.11与255.255.255.0得到的结果是192.168.217.0,类似门牌号。
路由表:
route -n(n:显示ip)
说明:关机是空,开机生成。
路由判定:ip与netmask按位与运算,然后与网络号进行匹配,最后决定使用哪一条记录来发送数据包,最后一条记录是默认网关,不管ip是什么,与四个0按位与运算,得到的结果都是四个0的网络号。
下一跳:选取最近并可靠的结点发送数据包,而不是规划发送路线。
2、链路层
以太网:Ethernet:MAC
查看MAC地址表:
arp -a(a:使用bsd形式输出)
ARP(Address Resolution Protocol)协议:
1、物理层
二、功能分层
- 能够申请到端口号
- 路由表有下一跳条目
- ARP能请求到下一跳MAC
- 上次握手
- 传输数据
- 四次分手
说明:
- Flag标志位,是六个二进制位,01切换表示这个数据包的状态。
- 源IP地址是自己的IP地址,目的IP地址是目标地址(例如:百度的地址)。
- 目的MAC是下一跳的MAC地址,源MAC地址是自己的Mac地址。
三、总结
1、整个互联网建立在下一跳的模式下
- IP是逻辑上的两个端点
- MAC是物理上连接的两个节点
2、端点间TCP传输过程中
- 确认机制
- 状态机制
- 不可分割
3、解析数据包需要成本
- 交换机:二层,只关心MAC地址(学习机制)
- 路由器:三层设备,只关系IP和路由表
- LVS服务器:四层,只关心PORT、状态
- nginx:七层,关心socket对应关系(http)
4、负载均衡
四层(lvs):快,应付更大的流量。
七层(nginx):慢于四层,看得懂客户端请求的资源。