OSI七层模型
从下到上依次为:
物理层(bit流)
定义设备标准,如网线的接口类型、各种传输介质的传输速率等
物理层定义的规范有:RS—232、RJ—45等
数据链路层(数据帧frame)
这一层定义了如何让格式化数据进行传输,通常还提供错误检测和纠正,以确保数据的可靠传输
在这一层中工作的协议有:ARP、IEEE 802.3、STP等
网络层(数据包packet)
将数据传输到目标地址,主要实现寻找地址和路由选择。网络层还可以实现拥塞控制、网际互联等功能
在这一层中工作的协议有:IP、ICMP、RIP等
传输层(数据段segment)
提供端到端的服务,可以实现流量控制、负载均衡。
传输层信息包括端口、控制字和校验和
在这一层中工作的协议有:TCP、UDP等
会话层(报文)
负责建立和断开通信连接,记忆数据的分隔等数据传输相关的管理
表示层(报文)
主要负责数据格式的转换,例如将来自下一层的数据转换为上层能够处理的格式。
表示层的数据转换包括数据的加密压缩等
应用层(报文)
直接面向用户的程序或服务
在这一层中工作的协议有:HTTP、FTP、SMTP等
五层模型是把最上面三层合并为一层------应用层
TCP三次握手
缩写含义:
SYN:同步序列编号(用于发起一个连接)(标志位)
FIN:用于结束一个连接
ack:32位确认序号
seq:32位序号
ACK:1位(0或1)
1、客户端(client)发送 SYN (标志位)= 1 ,seq = 随机值(t)给服务端(server),然后进入SYN_SENT状态等待服务器确认
2、服务端(server)收到后产生 ack = t+1 以及 ACK = 1 服务端将 SYN 置 1,并产生一个 seq = 随机值(k),然后将这些信息发送给客户端后进入SYN_RCVD状态等待客户端确认
3、客户端(client)发送 ACK = 1,ack = k+1给服务端并建立连接
为什么要三次握手而不是两次?
因为服务端不能知道客户端是否收到了第二步中服务端给客户端的回应
四次挥手
1、客户端发送FIN = 1,和一个随机值 seq = t 给服务端,然后客户端进入FIN_WAIT_1状态
2、服务端收到后,发送 ACK = 1, ack = t + 1给客户端,然后服务端进入FIN_WAIT_2状态
3、服务端再次发送 FIN = 1, 和一个随机值 seq = k 给客户端
4、客户端收到后发送 ACK = 1, ack = k + 1 给服务端,然后客户端进入TIME_WAIT状态,服务端收到后就关闭连接。 此时,客户端等待2MSL后依然没有收到回复,则证明服务端已经正常关闭,然后客户端关闭连接
这里的 MSL(Maximum Segment Lifetime)为报文最大生存时间 2MSL即为 2 倍的报文最大存活时间
为什么需要等待 2MSL?
因为在最后一步中,客户端发送ACK包后无法确认服务端是否收到,所以2MSL的时间可以保证如果对方没收到此包,会重新发送第三步中的FIN包,且这个包有足够的时间发送回来。 如果在这个时间内还没收到重发的FIN包,则可以证明对方已经收到该ACK包
能否将中间的两次合并,将四次变成三次?
不能。 因为在关闭连接时,服务端可能还有报文没有发送完毕,只能先回复一个ACK包,告诉客户端 “你发的FIN包我收到了”。只有等到服务端将报文全部发送完毕,准备好可以断开连接,然后才发送FIN包给客户端。 所以不能合并。
|