传输层
主机与主机的通信实质上是进程与进程之间的通信。
传输层只有主机才有的层次,中间的结点都只有三层。
网络层是为主机到主机的通信提供服务,但是再实际情况中,数据如果只是到达主机,并没有通信结束,只有把数据传递给某一个具体的进程或者进程中的线程时,才能勾完全通信的过程,所以不仅是网络层还需要传输层
复用:发送时,将不同进程的数据(报文段)使用传输层同一协议进行传输。
分用:接受时,将链路上同一协议发送的数据分开传送给不同的进程。
复用与分用类似寄信的过程。传输层对收到的报文段进行差错检测,因为网络层的IP数据报首部检验和只检测了首部,传输层检测数据部分。
传输层的寻址与端口
在网络层和链路层,数据的传输只需要先通过IP地址找到主机的所处的网络,当数据传入网络后,再根据MAC地址定位到具体那一台主机,而对将主机上具体进程的定位就是端口。
套接字标识一个端点,即发送的终点。
1、(用户数据报)UDP协议
相比于TCP不严格,不建立连接。
UDP面向报文:即UDP会将应用层的报文完整的进行封装为传输层的UDP数据报,而再下一层网络层封装为IP数据报,但是在传输时会进行分组,这样在路由器上进行传输时可能会造成丢失。因此应用层的报文必须适量。
UDP无法保证可靠传输,当传输层采用UDP协议时,需要网络层来进行可靠传输。
UDP首部格式:
UDP校验过程:
2、TCP协议
应用程序在通信之前,必须先建立TCP连接,通信完成后释放掉,而只是逻辑上的连接,不同于数据从上至下封装再上链路传输的的物理连接,因此时虚连接。
TCP提供全双工通信,主要包含发送缓存和接收缓存两个类似队列的缓存。
填充的作用是让首部保持4B的整数倍20B。
确认号:每个分组的第一个字节的序号。
TCP虽然面向字节流,但是会将很多字节总成报文段进行发送。
TCP面向连接,每接收到一个分组就需要回复确认,同时确认号即确定下一个报文段的第一个字节序号,又证明来前面序号的数据已经正确接收。
当接收方突然无法接收文件并通知发送方停止发送,发送方收到通知信息,并利用命令(紧急数据)来停止发送,而命令会进入数据部分TCP缓存当中,紧急数据中URG = 1,优先级最高,便可以插报文段发送缓存的队并发送出去,告诉接收方我不发啦。
PSH相比较URG是改变的是接收端TCP缓存报文段的顺序,PSH = 1,将该报文段优先交付给应用层。
紧急指针报告了紧急数据的位置与字节数。
2.1 TCP连接管理
3次握手:
第一次:
客户端发送连接请求报文段,无应用层数据,此时,SYN = 1,表明这是请求报文/确认报文,seq即序号,随机生成x位。
第二次:
服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。
SYN = 1,ACK = 1,说明确认号有效,确认号ack = x+1
第三次:
客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。
SYN=0,ACK=1,seq=x+1,ack=y+1
由于三次握手中客户端和服务器都位TCP连接分配缓存和变量,会导致黑客的洪泛攻击。
4次握手
1. 客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN=1, seq=u
2. 服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了--半关闭状态。
ACK=1,seq=v, ack=u+1 #半关闭即客户端虽然不再发送了,但是服务器还可以发送
3. 服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。
FIN=1,ACK=1,seq=w,ack=u+1
4. 客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。
ACK=1,seq=u+1,ack=w+1
2.2 TCP可靠传输
TCP虽然面向字节流,但是会将很多字节总成报文段进行发送。TCP缓存中一个字节占一个序号,接收时可按照顺序进行重排。而其实当第一个报文段分组传给TCP缓存后,即使接收端已经上传给应用层,发送端TCP缓存中的该报文段也是仍然还在的,主要是为了防止在发送过程的丢失,当没有收到接收方的确认报文段,发送方会进行重传,收到确认后才会从缓存中删除。
这里确认报文段也不一定就是单独发送的,也可以和其他报文段数据一起,捎带确认。
累计确认:这里如果78先到,456没到,那接收方的确认号还是4,78也会正常接收,但是还是会告诉发送端我需要4以后的报文段。
RTT是往返时间,即一个报文段发送到收到确认为止的时间。每一个报文段都能算出一个RTT,最终算出RTTS。
但是如果RTTS还是太久了—>冗余ACK
快速重传:当发送方接收到同样的三次确认后执行快速重传,在计时器结束之前发送可以节省等待时间。
2.3 TCP流量控制
接收方利用确认报文段中的窗口字段控制发送方滑动窗口大小,窗口字段也可以是0,发送方不在发送,此时TCP缓存较多,需要接收方上缴一部分数据给应用层。但是这里存在一个问题便是,当发送方不在发送了,即使接收方上传应用层完毕,但是如果没有多余的动作,两者都会陷入等待。此时:
这里同样可以发送方发送很多报文段,最终接收方只确定回复一个最终的确认报文段,
2.4 TCP拥塞控制
慢开始与拥塞避免:
窗口大小由发送方的拥塞窗口确定,窗口大小随着传输轮次(RTT)而增大,而当窗口大小达到慢开始门限(ssthresh),则进入拥塞避免,窗口大小的增长速率减小,但是还在增长。直到出现网络拥塞、丢包等现象,直接在几个轮次内将窗口大小改为初始值(最小),而新的一轮慢开始的门限则是网络拥塞时的窗口大小➗2。
快重传与快恢复:
快重传:当发送方接收到同样的三次确认后执行快速重传,在计时器结束之前发送可以节省等待时间。
当收到3个重复的确认时,认为报文段丢失,此时陷入拥塞,进行快速重传,窗口大小直接降到拥塞窗口大小➗2,也就是新的门限值哪里;然后进行快速回复。