OSI的七层模型分别是什么, 各自的功能是什么?
应用层: 文件传输, 电子邮件, 文件服务, 虚拟终端, 各种应用软件
协议 TFTP HTTP SNMP FTP SMTP DNS Telnet
表示层: 数据格式化, 代码转换, 数据加密
协议: 没有协议
会话层: 控制应用程序之间的会话能力, 如不同软件数据分发给不同的软件
协议: 没有协议
传输层: 提供端对端传输数据的基本功能, 如TCP, UDP
协议: TCP, UDP
网络层: 定义IP编址, 定义路由功能, 如不同设备的数据转发
协议: IP ICMP RIP, OSPF BGP IGMP
数据链路层: 定义数据的基本格式, 如何传输, 如何标识, 如网卡MAC地址
协议: SLIP, CSLIP, PPP, ARP, RARP, MTU
物理层: 以二进制数据形式在物理媒体上传输数据
协议: ISO2110 IEE802
在四层, 传输数据被称为段(Segments)
在第三层被称为包(Packets)
二层网络层被数据称为帧(FRames)
一层物理层时数据被称为比特流(Bits)
网络七层模型是一个标准, 而非实现
网络五层模型是一个实现的应用模型
网络五层模型是由七层模型简化而来
三次挥手
第一次握手: 客户端给服务端SYN报文, 并指明客户端的初始化序列号(ISN). 此时客户端处于SYN_Send状态
第二次握手: 服务器收到客户端的SYN报文后, 会以自己的SYN报文作为应答, 并且也是指定了自己的初始化序列号ISN, 同时会把客户端的ISN + 1作为ACK的值, 表示自己已经收到了客户端的SYN, 此时服务器处于SYN_RCVD的状态
第三次握手: 客户端收到SYN报文后, 会发送一个ACK报文, 也是把服务器ISN + 1作为ACK的值, 表示收到了SYN的报文, 客户端处于established
服务器收到ACK报文. 也处于established的状态, 此时双方建立了连接
三次握手的目的:
- 确认双方的接受能力, 发送能力是否正常
- 指定自己的初始化序列号, 为后面的可靠传送做准备
三次握手中可以携带数据吗
第一和第二次握手可以不携带数据, 第三次握手可以携带数据. 如果第一次就能携带数据的话, 如果有人要恶意攻击服务器, 那他每次都在第一次握手的SYN报文中放入大量数据, 攻击者根本不用理会服务器的接受, 发送能力是否正常, 疯狂发送SYN报文, 会让服务器花费很多时间, 内存来接受这些报文, 也就是说, 第一次握手可以放数据的话, 服务器会很容易遭到攻击
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
为什么需要四次挥手?三次不行?
- 第一次挥手: 客户端发送一个FIN报文, 报文中会指定一个序列号, 此时客户端处于FIN_WAIT1
- 第二次挥手: 服务器收到FIN报文, 会发送ACK报文, 且把客户端的序列号值 + 1作为ACK报文的序列号, 表明已经收到客户端的报文了, 此时服务器处于CLOSE_WAIT状态
- 第三次挥手: 如果服务端也想断开连接了, 服务器发送FIN报文, 且指定一个序列号, 此时客户端处于LAST_ACK状态
- 第四次挥手: 客户端收到FIN后, 一样发送了一个ACK报文作为应答, 且把服务端的序列号值 + 1作为自己的ACK序列号值, 此时客户端处于TIME_WAIT, 需要过一阵阵子确保服务端收到自己的ACK报文后才进入CLOSED状态
- 服务端收到ACK之后, 就处于关闭连接了, 处于CLOSED状态
TIME_WAIT状态, 客户端发送ACK后不会关闭, 而是等一阵子才关闭, 要确保服务器已经收到我们的ACK报文, 如果没有收到的话, 服务器会重新发送FIN报文, 就知道之前的报文丢失了, 再次发送报文
TIME_WAIT持续时间至少是一个报文的来回时间, 一般会设置一个计时, 如果这个计时没有收到FIN报文, 则代表发送成功, 此时就处于CLOSED状态