1. 概述
1.1 传输层的意义
网络层可以把数据从一个主机传送到另一个主机,但是没有和进程建立联系。
传输层就是将进程和收到的数据联系到一起,使数据能够为应用服务
所以说传输层是主机才有的层次
1.2 TCP和UDP
TCP:可靠、面向连接、时延大、适用于大文件
拥塞控制、流量控制、连接建立
UDP:不可靠,无连接、时延小、适用于小文件。收到UDP报文后不需要给出任何确认
1.3 复用和分用
复用:应用层的所有应用进程都可以通过传输层再传到网络层
分用:传输层 从网络层收到数据后交付给指明的应用进程
应用程序 | 端口号 |
---|---|
FTP | 21 |
TELNET | 23 |
SMTP | 25 |
DNS | 53 |
HTTP | 80 |
2. UDP协议
2.1 UDP概述
UDP一次发送一个完整报文不会分片,所以需要应用层传输过来的数据不要太大,否则网络层分片任务就很重,但是也不能太小,不然效率较低
应用层给UDP多长的报文,UDP就照样发送,即一次发送一个完整的报文。
UDP适合一些实时应用,因为实时应用延迟要求高,需要立即响应
UDP只在IP数据报服务之上增加了复用分用和差错检测功能。
面向报文
2.2 UDP首部格式
2.2.1 UDP的校验位
伪首部只有在计算校验和时才出现,不向上递交也不向下传送
封装UDP报文的IP数据报首部协议字段是17
UDP长度:UDP首部8B + 数据部分长度
2.2.2 UDP校验方式
在发送端:伪首部+首部+数据采用二进制反码求和,将结果填入检验和字段,
然后去掉伪首部发送
3. TCP协议
3.1 TCP协议特点
TCP必须建立连接后才能进行数据交换,
TCP提供可靠交付的服务,可靠有序,不丢不重。
全双工通信:有发送缓存和接收缓存
面向字节流:把应用程序交下来的数据看成是一串无结构的字节流
3.2 TCP报文的首部
序号:序号的单位是字节,即每一个字节都按照顺序编号。这个字段表示本报文段发送数据的第一个字节的序号。
确认号:期望收到的对方下一个报文段的第一个数据字节的序号。若确认号是N,则前N-1的数据都已经正确接收。
数据偏移:即首部长度,以4B为单位。TCP有20B的固定首部
3.2.1 TCP首部的控制位
ACK:ACK=1时表示确认号有效,在连接建立后所有报文段都要置1.
三次握手时,除了第一次,其余ACK都为1.
SYN:同步位,表示是在进行请求连接或者接收连接。握手的前两次SYN位置1.
3.3 TCP连接管理
3.3.1 TCP三次握手
第一段的意思是
SYN=1:(A)要建立连接了!
seq=x(随机):因为还没有数据,所以写什么都无所谓
第二段的意思是
SYN=1:我(B)同意你(A)建立连接!
ACK=1:连接建立了,之后的ACK必须都置为1
seq=y(随机):因为还没有数据,所以写什么都无所谓
ack=x+1:之前发送方(A)说发送的是第x位数据(虽然发送方是瞎说的),所以我(B)要的是x+1位数据
第三段的意思是
SYN=0:SYN只有在建立连接时才为1,其他时候均设为0
ACK=1:连接建立了,之后的ACK必须都置为1
seq=x+1:我(A)发送的报文段的第一个字节就是x+1
ack=y+1:之前接收方(B)说发送的是第y位数据(虽然接收方是瞎说的),所以我(A)要的是y+1位数据
注意一下,TCP是双向的,所以不存在绝对不变的发送方接收方,这里的两台主机都同时是发送方和接收方
3.3.2 SYN洪泛攻击
攻击者发送SYN请求建立连接,服务器返回ACK时,攻击者不予以确认,这个TCP连接就处于挂起状态。服务器没收到确认,会重复发送ACK给攻击者,浪费其资源。
3.3.3 TCP四次挥手
第一段的意思是
FIN=1:(A)要释放连接了!
seq=u:发了好多数据,这里只是用u指代一下,这里u是有确定值的
第二段的意思是
ACK=1:连接建立了,之后的ACK必须都置为1
seq=v:发了好多数据,这里只是用v指代一下,这里v是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(尽管此时A已经决定释放连接了)
第三段的意思是
FIN=1:(B)要释放连接了!
ACK=1:连接建立了,之后的ACK必须都置为1
seq=w:发了好多数据,这里只是用w指代一下,这里w是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(因为A直接不发数据了,所以第二段第三段的ack都是u+1)
第四段的意思是
ACK=1:连接建立了,之后的ACK必须都置为1
seq=u+1:之前发的数据时第u位数据,B也要第u+1位数据,所以我发第u+1位数据
ack=w+1:之前发送方(B)说发送的是第w位数据,所以我(A)要的是w+1位数据
为什么需要等待计时2MSL?
因为这样可以保证B可以收到A的终止报文段进而进入关闭状态
比如说如果A的第四段报文丢失,那么等待一个MSL之后B就会重传第三段报文,花费小于1MSL之后A就会再收到第三段报文,之后就可以再次向B发送第四段报文提示B关闭连接
3.4 TCP的可靠传输
UDP这种本身不可靠的依赖于应用层去解决。
可靠:保证接收方进程从缓冲区读取的字节流与发送方发出的字节流完全一样。
TCP实现可靠传输的机制:
- 校验 2. 序号 3. 确认 4. 重传
累计确认机制:从第一个丢失的字节开始请求丢失的报文段。
如图中456丢失,78到达,但仍然请求发送的数据序号是4
冗余ACK:发送方收到三个对于报文段1的冗余ACK,就重传报文段2.
3.5 TCP流量控制
简单来说就是接收方可以动态的发送信息告诉发送方发送窗口的大小。
接收方接受不过来了就让发送方发送窗口小点,这样发送方发送的速率就慢下来了,接收方就有时间处理它的数据了
接受方处理完了也可以发送请求让发送方发送窗口大点,这样发送方发送的速率就快起来了,接收方就可以处理更多数据而不是空闲等着收数据了。
例外情况:B不允许A发送数据了,过一段时间后,B处理完数据想要恢复窗口大小但发送的有rwnd大小的数据报丢了。对于A,之前B回复的发送窗口为0,而B也在等待A的回复。
计时器设置:当A收到B的接收窗口为0,开启计时器,设置的时间到后,发送一个探测报文段,接收方收到探测报文段后给出现在的窗口值。
3.6 TCP拥塞控制
流量控制是对单独一个来说,拥塞控制是对于一群,防止过多的数据注入网络当中。
3.6.1 基础假定
- 数据单方向传送,而另一个方向只传送确认
- 接收方总是具有足够大的缓存空间,因而发送窗口大小取决于拥塞程度
发送窗口= min{接收窗口,拥塞窗口}
接收窗口:接收方根据接收缓存设置的值,并告知给发送方,反映接收方容量
拥塞窗口:发送方自己估算的网络拥塞程度设置的窗口值
3.6.2 慢开始和拥塞避免
开始指数形式增长,到达阈值后线性增长。
到达拥塞状态后,阈值降为原来的一半,拥塞窗口设置为1.
3.6.3 快重传和快恢复
在收到连续的ack确认之后执行,这里的ack就是冗余ack,冗余ack的特点是如果多次对某一段请求的数据没有被收到,达到一定数目之后就会立即执行重传。
此时传输数据报降到原来的一半,而不是降到1.