Linux网络:传输层
传输层,负责数据能从发送端传输到接收端
零. 前置的一些知识
理解什么是报文在内核角度
socket套接字和文件系统的关系
一. UDP协议
1. 端口号
端⼝号(Port)标识了⼀个主机上进⾏通信的不同的应⽤程序
在TCP/IP协议中, ⽤ "源IP", "源端⼝号", "⽬的IP", "⽬的端⼝号", "协议号" 这样⼀个五元组来标识⼀个 通信(可以通过netstat -n查看)
端口号的划分:0~1023为知名端口号,HTTP, FTP, SSH等这些⼴为使⽤的应⽤层协议, 他们的端⼝号都是固定的。1024~65535,为操作系统动态分配的端口号。
一个进程可以绑定多个端口号,一个端口号只能绑定一个进程。
2. UDP协议
对于一个协议来说,需要解决两个问题,第一是,报头和有效载荷怎么分离,第二个是分用问题,
对于第一个来说,UDP的协议的报头部分的大小是固定的,可以使得报头和有效载荷分离,第二个问题,就是如何交付给上层,和如何返回,根据目的端口话,和源端口号。
16位UDP长度:里面保存了UDP的总长度,包括报文的报头和正文的属性的和。所以UDP已经做过了粘包问题,所以UDP不考虑粘包问题。但是这个大小是16的也就是意味着,我们发送的大小是有最大限制的,也就是最大64K,如果我们需要传输的数据超过64K, 就需要在应⽤层⼿动的分包, 多次发送, 并在接收端⼿动拼装。
16位的UDP校验和:如果校验和出错, 就会直接丢弃。
协议其实就是一个结构化的字段在OS的内核中,在Linux中的结构如下图
3. UDP的特点
二. TCP协议
1. TCP的协议的格式
怎么区分正文和有效载荷,报头的大小固定为20字节,4位首部长度(单位为4字节),里面保存了报头和选项的大小的和。
16会源端口号和目的端口号,UDP写过
剩余的可靠性里面讲。
2. 理解TCP的可靠性的问题
TCP的可靠性的核心是确认应答机制,我们只需要保证消息的可靠性,而不需要保证应答的可靠性,我们接收到一个消息,给对方做应答,表示我们收到了历史的信息,对方对方是否收到我们的应答,我们不关心,如果没有收到应答对方会重新发送的。应答不需要再应答了。应答是不带数据的。
在实际的场景中,并不是对方发一条信息,我们就回复一条应答,这样的效率太低了(但是也会存在这种),更一般的场景是一次发送多条的消息,然后再应答。注意:我们来回发的报文。
接收的顺序可能是乱序的,所以发送的时候需要有序号。对于应答来说有确认序号的概念。
为什么TCP报头里面需要两个序号,因为我们应答的时候,可以把我们要发送的数据发过去,这叫捎带应答,即是对上个消息的确认,也是一个的数据的报文。
主机A给主机B发送了大量的数据,导致主机B来不及接收的话,主机B就会丢包,但是这样的丢包是不合理,因为主机A到主机B消耗了大量的资源,所以有了16位窗口大小,这样我们可以知道对端剩余接收窗口的大小,也就是对端的接收能力。我们把这种根据窗口大小调整发送速率的这种方式叫做,流量控制。
有的报文是请求建立连接的,应答的,断开链接,有不同的状态,所以需要不同的标志位。标志位的本质其实就是比特位。