各层协议的作用, 以及TCP/IP协议的特点
1. 五层协议
- 运用层: 为特定的程序提供数据传输服务, 比如HTTP, DNS, 数据单位为报文
- 传输层: 为进程提供通用数据传输服务. 运输层包括两种协议:TCP 与 UDP
- 网络层: 为主机提供数据传输服务. 而传输层协议是为主机中的进程提供提供数据传输服务. 网络层把传输层传递下来的报文段或者用户数据报封装成分组
- 数据链路层: 网络层针对的还是主机之间的数据传输服务, 而主机之间可以有很多链接, 链路层协议就是为同一链路的主机提供数据传输服务. 数据链路层把网络层传下来的分组封装成帧
- 物理层: 考虑的是怎样在传输传输媒体上传输数据比特流, 而不是具体的传输媒体. 物理层的作用是尽可能屏蔽传输媒体和通信手段的差异, 使数据链路层感觉不到这些差异
2. OSI
- 表示层: 数据压缩, 加密以及数据描述, 这使得应用程序不必关心在各台主机中数据内部格式不同的问题
- 会话层: 建立及管理会话
3. TCP/IP协议
将五层协议中的数据链路层和物理层合并为网络接口层
TCP/IP体系结构不严格遵循OSI分层概念, 应用层可能会直接使用IP层或网络接口层.
4. 数据在各层之间的传递过程
在向下的过程中, 需要添加下层协议所需要的首部或者尾部, 而在向下的过程中不断拆开首部和尾部
路由器只有下面三层协议, 因为路由器位于网络核心中, 不需要为进程或者应用程序提供服务, 因此也就不需要传输层和应用层
UPD与TCP比较, 分析上层协议应该使用UDP还是TCP
-
传输控制协议TCP, 提供面向连接, 可靠的数据传输服务, 数据单位为报文段; 提供可靠交付, 有流量控制, 拥塞控制, 提供全双工同学, 面向字节流(把应用层传下来的报文看成字节流, 把字节流组织成大小不等的数据块), 每一条TCP连接只能是点对点的(一对一)
-
用户数据报协议UDP, 提供无连接, 尽最大努力的数据传输服务, 数据单位为用户数据报; 没有拥塞控制, 面向报文(对于应用程序传下来的报文不合并也不拆分, 只是添加UDP首部), 支持一对一, 一对多, 多对一, 多对多的交互通信.
TCP主要提供完整性服务, UDP主要提供及时性服务.
理解三次握手以及四次挥手具体过程, 三次握手的原因, 四次挥手原因, TIME_WAIT的作用
TCP的三次握手
假设A为客户端, B为服务器端.
- B处于监听状态, 等待客户端的请求
- A向B发送请求报文, SYN=1, ACK=0, 选择一初始序号x
- B收到请求报文, 如果同意建立连接, 想A发送连接确认报文, SYN=1, ACK=1, 确认号为x+1, 同时也选择一个初始的序号y
- A收到B的连接确认报文后, 还要想B发出确认, 确认号为y+1, 序号为x+1
- B收到A的确认后, 连接建立
三次握手的原因
第三次握手是为了防止失效的连接请求到达服务器, 让服务器错误打开连接
TCP的四次挥手
- A发送连接释放报文, FIN=1
- B收到后发送确认, 此时TCP属于半关闭状态, B能想A发送数据但是A不能向B发送数据
- 当B不再需要连接时, 发送连接释放报文, FIN=1
- A收到后发出确认, 进入TIME-WAIT状态, 等待2MSL(最大报文存活时间)后释放连接
- B收到A的确认后释放连接
四次挥手的原因
客户端发送了FIN连接释放报文后, 服务器收到了这个报文, 就进入了CLOSE-WAIT状态, 这个状态是为了让服务器发送还未传送完毕的数据, 传送完毕之后, 服务器会发送FIN连接释放报文
TIME_WAIT
客户端接收到服务器端的FIN报文后进入此状态, 此时并不是直接进入CLOSED状态, 还需要等待一个时间计时器设置的时间2MSL. 这么做有两个理由:
- 确保最后一个确认报文能够到达. 如果B没收到A发送来的确认报文, 那么就会重新发送连接释放请求报文, A等待一段时间就是为了处理这种情况的发生
- 等待一段时间是为了让本连接持续时间内所有产生的报名都从网络中消失, 使得下一次新的连接不会出现旧的连接请求报文.
可靠传输原理, 并设计可靠UDP协议
TCP使用超时重传来实现可靠传输: 如果一个已经发送的报文段在超时时间内没有收到确认, 那么就重传这个报文段. (实现方法: 确认机制, 重传机制, 滑动窗口)
一个报文段从发送再到接收到确认所经过的试产称为往返时间RTT.
最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。
- 1、添加seq/ack机制,确保数据发送到对端
- 2、添加发送和接收缓冲区,主要是用户超时重传。
- 3、添加超时重传机制。
详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。
目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。