传输层概述和分类

应用层和传输层约定端口号
而两台主机的端口号是相互独立的,是主机自己的资源,不同主机重复是可以的
而且重复的端口号使用的协议不同也可以相同,送达时也需要根据协议送达数据
套接字就是一个数据结构,是一个指针,指向网络中和本进程通信的另一个进程


熟知端口号

复用分用

差错检测

UDP/TCP
有链接传输和无连接传输

UDP数据报/TCP数据报
不能支持太大的报文,udp不能够拆分报文/TCP支持报文拆分
UDP尽最大努力交付但不管正确
TCP有拥塞控制
TCP仅支持一对一,UDP支持一对多和一对一


UDP数据报格式
UDP数据报实例

UDP总结

UDP检验
将数据部分以16bit为一组拆分成多组相加
然后按位取反得到校验和一起发送给接收方
接收方将分组和接收方分组和校验码相加全1则对
其中要注意回卷现象




UDP校验总结

TCP协议
TCP协议三个阶段
前两次挥手之时断开一个方向的链接
断开的是先挥手的方向
释放连接是客户端和服务器都可以先释放

什么叫做面向字节流的,即TCP不分报文只按字节流封装到TCP报文里,一个TCP报文可能内部的数据有多个报文

TCP段格式

TCP首部


其中一个报文的起始序号字段的第一个分片起始序号由自己决定
ACK在整个TCP过程中只有第一次握手的时候为0
确认号意义如图所示
假定客户端的TCP报文接收了第一第二个报文段
那么当报文段返回信息的时候ACK=1表示已经收到了之前的所有报文段
并且下一个报文段的起始序号应该是2500

其中数据偏移用于表示TCP的首部长度


SYN和FIN

注意上图的重要结论和下图的通信过程中各个挥手的含义即可知道什么情况

窗口

窗口字段的具体意义如下所示,假定接收方开辟了一个接受缓冲区那么该缓冲区假定已经接受了1,2报文段
此时缓冲区还剩下500B那么第三个1000B的报文段必须进行拆分才能够进行发送,发送方会受到接受方发来的报文字段其中窗口代表着下一次要发送的数据的大小



MSS设置
在选项长度字段接收方和发送方进行协商

三次握手
其中要点就是两个服务器的ACK和seq的变化
其中ack表示我期望我接受到的下一个数据是什么,尽管第一次握手时什么数据也不携带,但是TCP规定需要消耗一个序号
当握手2返回时他的Seq是由自己规定的,表示它将要发送的序号的起始是多少
握手3的ACK则是返回握手的seq+1

注意握手3可以携带数据也可以不携带数据

状态转换是记忆型考点,考前观看即可

耗时分析
服务器进程是收到握手3才能开始发送数据

四次挥手

状态转换,也是纯记忆考点

释放连接耗时分析
等待是为了方式挥手4传输失败


TCP连接管理总结

可靠传输和流量控制
建立缓冲区然后通过程序的函数调用从指定的缓冲区读取数据到预留好的空间






快重传机制
其中累计确认机制的rwnd的大小不是看缓冲区还剩多少,而是看顺序接收的时候,有序的最新的序号-接受前的序号
比如如下图所示
一开始缓冲区为空rwnd为4
当发送发连续发送四个报文
其中623丢失但是624和625收到了
此时缓冲区实际存放的数据是
622 624 625
但是少了一个623
客户端返回的时候他的缓冲区指针依旧指向623那个位置,它期待着下一个收到的分片是623
此时缓冲区大小再-指针的位置就可以得到rwnd

快重传机制
如下图所示,当收到622后,客户端期待着下一个吃入的是623分片
但是接下来连续收到的却是624 625 所以每每收到一个分片就会返回ack623
告知服务器我需要的是623
但注意是冗余ACK,第一个ack是合法的,所以准确的说是1个合法+3个冗余才会触发重传

可靠传输总结
其中推迟确认中连续收到两个长度为MSS的报文段就应该立即返回ACK是因为超时重传的代价太大,不能够拖延

流量控制总结

拥塞控制


慢开始算法
即拥塞窗口的大小变化
在大部分情况下可以看作发送窗口的大小
其中单位是1MSS
在到达阈值之前拥塞窗口会指数增长变大
因为一开始网络不拥塞,为了充分发挥网络的性能所以要快速变大,去试探拥塞的程度
而到了一定的阈值之后,就需要加法增大窗口,因为再指数增长可能就会引发拥塞了

对应的网络发送图如下所示


而当发生超时重传的时候会立马回到慢开始算法
当发生超时重传时会立马变成1的拥塞窗口
且阈值会变成刚才发生超时重传的窗口的大小的一半
注意,当慢开始算法开始时
如果某次翻倍的大小会大于阈值,那么会直接到阈值而不是翻倍的大小
如下图所示的17时间段

例题,注意从零时刻就会发送数据而不是等到1时刻才发送

快重传和快恢复
此时网络不是很拥塞,那么就会直接令拥塞窗口等于3个重复确认ACK发生时的拥塞窗口的二分之一,阈值也是如此,然后在进行拥塞避免算法

但注意阈值不能小于2

错题&易错点
UDP的伪首部不向上传递也不向下交付,纯粹是临时校验用
UDP校验不是必须的,校验和全0则说明不需要校验
UDP检验出错时可以交付上层,不过要报告这是错误的数据报
UDP计算出最后的校验和之后要全部取反才是真正的检验和