文章目录
第五章 传输层
传输层概述
研究进程之间的逻辑通信问题
传输层
- 主机才有的层次
- 网络层的首部校验和只能校验头部,不能校验数据部分,传输层可以实现数据的检错,这样就不需要网络层再检测数据部分了
传输层的两个协议
传输层的寻址与端口
- 这里的端口是软件端口/逻辑端口,标识主机进程,与路由器的硬件端口不同
- 端口号只需要在主机内有唯一性即可,不同主机之间的端口没有联系
UDP协议
用户数据报协议UDP概述
- UDP不保证可靠交付,靠网络层实现可靠交付
- UDP面向报文是指,UDP对于应用层传下的报文,既不合并也不拆分,对报文的长度不改变,保留应用报文的边界,
- 因此需要应用层选择合适的报文长度,否则就会导致报文传输到网络层过长,需要分片,降低传输效率;
- 无连接,不可靠,面向报文,适合实时,首部开销小
UDP首部格式
- UDP的数据已经进入到主机了,因此也就不需要地址了,靠端口号来识别进程
- 源端口号可有可无,需要回复就给,不需要回复就不给,目的端口号必须有
- 16位UDP长度指整个UDP数据报长度(首部+数据),单位字节
- 16位UDP检验和检测整个UDP数据报是否有错,错就丢弃,分用时找不到目的端口号,也会对其报文,并发送ICMP差错报告报文
UDP校验
- 图中的UDP数据报的首部开头又多了个伪首部,这个伪首部很像IP数据报的首部
- 伪首部只会在计算校验和时才会出现,不向下传递也不向上提交
- 伪首部:
- 第三个字段固定为0,
- 第四个字段表示协议,封装这个UDP报文的IP数据报的首部协议字段是17,所以这里也是17
- 第五个字段UDP长度,是UDP首部+数据部分的长度,不包括伪首部
注意:接收端中的检验和是经过计算后的检验和
TCP协议特点和TCP报文段格式
TCP协议特点
- 1.面向连接(虚连接):虚连接指这并不是实际的物理连接,实际的物理连接应该是层层封装解封装,TCP连接就好像是进程和进程直接连接了一样(疑问,难道TCP协议不是层层封装通信的??)
- 2.只能点对点,无法广播和多播
- 3.可靠有序,不丢不重
- 4.全双工,收发都有缓存
- 5.面向字节流
TCP发送数据举例
- 发送方将要发送文件,会将发送的数据按照字节排好序,并进行编号
- 将要发送的时候,提前把发送的字节放入TCP的缓存中,
- 发送数据时,从缓存中按顺序取出一定的字节数,加上TCP首部,形成完整报文段发送出去
TCP报文段首部格式
- 考试重点,答题中经常考察对某些字段的理解
- TCP报文段主要包含:首部,数据部分
- 首部包含:固定首部,选项,填充(凑4字节的整数倍,填全0)
- 源端口,目的端口,即字面意思
- 序号:将要发送的字节都有自己的编号(123456789…),序号字段填的就是当前的TCP报文中数据部分的第一个字节的编号,比如上图中的首部中序号字段填的就是1,如果发送456号数据,序号字段就是4
- 确认号:接收方收到了123号字节,并且知道下一个字节应该是编号4,所以回复的报文中,确认字段为4,表示期望收到4号字节
- 数据偏移:TCP报文段的数据起始处距离整个TCP报文段的起始处的距离,一个数代表4B,其实就是首部的长度,比如这里的数值为15,则表示首部的长度为60字节;为什么还要添加首部长度,可能还会有选项字段和填充字段,所以首部长度不确定
- 6个控制位:PSH和RST几乎不会考,了解即可
- 窗口:B给A发送数据,并且在窗口字段规定了B最大能接收的数据量,A收到报文以后,知道了下次给B发送数据不要超过B的最大接收量;比如,B给A发送的确认为701,窗口为1000,那么A下次就可以给B发送701-1700号字节
- 检验和:与UDP一样,检验首部+数据,检验时加上12字节的伪首部,伪首部的第四个字段是协议字段,UDP协议中是17,TCP协议中是6
- 紧急指针:URG=1时才有意义,表示从TCP数据部分的开头向后有多少字节是紧急的数据,其实就是标记了紧急数据在数据部分中的位置和字节数
- 选项:最开始是用于记录TCP报文字段中数据部分的最大长度,后来又加了几个字段,所以选项的长度也不确定,如果不满首部字节数为4的整数倍,还需要填充字段补充一下,了解即可
TCP连接管理
TCP连接三次握手,TCP断开连接四次握手
TCP连接传输三个阶段
- 采用客户服务器方式,不论是客户还是服务器,都可以接收数据发送数据
- 连接建立过程就是熟知的三次握手
TCP的连接建立
- 考试重点考察三次握手过程中报文段中重要字段的数值
- A想要和B通信
- A发送请求报文:SYN=1表示这是连接请求,seq=x是首部的序号字段,因为没有数据部分,所以x是随机产生的,ack是确认号,此时无效,因为上一步没有收到报文,无需期待
- B返回确认报文:B开始分配缓存和变量;SYN=1表示这是连接响应,ack=x+1表示确认,并期待收到x+1(其实本来也没有收到数据只是延续+1而已),由于B不返回数据,也随机发了seq=y,建立连接后ACK=1一直存在
- A对B的确认进行确认:A开始分配缓存和变量,SYN=0除了连接请求和响应其他时间都是0,ACK=1,seq=x