HTTP/1.1 200 OK
理解网络模型对于掌握网络通信原理至关重要,本文将针对OSI模型和TCP/UDP概念层模型进行总结,并重点对OSI模型中的各层功能及重要协议进行总结
OSI模型及TCP/IP概念层模型总结及对比
OSI七层模型 | TCP/UDP概念层模型 | 功能 | TCP/IP协议族 |
---|---|---|---|
应用层 | 文件传输、电子邮件及文件服务等 | FTP\HTTP\DNS | |
表示层 | 应用层 | 数据格式化及加密 | |
会话层 | 建立或解除连接 | ||
————————— | |||
传输层 | 传输层 | 提供端对端接口 | TCP/UDP |
————————— | |||
网络层 | 网络层 | 为数据包选择路由 | IP/ICMP |
————————— | |||
数据链路层 | 传输有地址的帧及错误检测 | PPP | |
物理层 | 链路层 | 在物理介质上传输数据 | IEEE |
应用层
HTTP/HTTPS(超文本传输协议)
关于这部分详见关于HTTP的讲解
传输层
TCP
三次握手
sequenceDiagram participant 客户 participant 服务器 客户->>客户:主动打开 服务器->>服务器:被动打开 客户->>服务器:SYN=1,seq=x 服务器->>客户:ACK=1,ack=x+1, SYN=1,seq=y 客户->>服务器:ACK=1,ack=y+1 客户->>客户:Established 服务器->>服务器: Established
三次握手流程
第一次握手(客户到服务器)
其中SYN表示请求建立链接,给定一个序号seq=x,一般为1,客户进入SYN-SENT阶段
第二次握手(服务器到客户)
标志位为SYN和ACK,表示确认报文seq有效,服务器能正常接收客户端发送的数据,同意创建新连接,给定序号seq=y,确认号ack=x+1,服务器进入SYN-RECV阶段
第三次握手(客户到服务器)
客户进入Established状态,标志位为ACK,表示确认收到服务器端同意连接的信号,序号seq=x+1,表示收到服务端的确认号ack,并将其作为自己的序号值,确认号ack=y+1,表示收到服务器端序号seq,并将seq+1作为确认号。服务器在接收到信号后进入Established状态,双方开始进行数据收发。
为何进行三次握手
为了防止服务器端开启一些无用连接增加开销,同时避免已经失效的连接请求报文段突然又传回服务端,产生错误响应。如果只有两次握手,那么服务器不知道客户端是否正确接收到了服务器端返回的消息。
四次挥手
四次挥手流程
第一次挥手:A发出FIN
第二次挥手:B回复ACK
第三次挥手:B发出FIN
第四次挥手:A发出ACK,用于确认收到B的FIN
当B接收到消息,认为双方达成同步,连接可以释放,此时B可以单方面释放端口号及内存等资源。但A不知道B是否接收到ACK,会有如下两种情况
- 如果B未收到ACK,会超时重传FIN,那么A会再次接收到FIN,并发送ACK
- 如果B接收到了ACK,那么不会回复任何消息
无论是那种情况,都需要等待,那索性就等吧,等待两种情况的最坏值,即去向ACK和来向FIN的最大消息存活时间,这是一个被动等死的过程。
为何等待2msl
为了确认服务器端收到了来自客户端发出的ACK确认报文,如果在2msl内,客户端又接收到了来自服务器端的FIN报文,说明服务器端没能接收到客户端发出的ACK确认。则客户端再次发送,并重置计时器。
TCP协议传输可靠性
由于TCP是一种面向字节流的传输协议,因此必须有一套机制保证传输过程可靠性,方法如下:
- 字节流服务:
- 数据包校验:
- 失序重排:
- 超时重发
- 流量控制