TCP协议(一)
TCP协议(一)
- 一、TCP协议的报文格式
- 二、TCP协议报文的解包和封装和分用
- 三、为什么TCP报文无需知道有效载荷的长度?
- 四、如何通过端口号找到特定的进程呢?
- 五、进程如何通过文件描述符读写传输层的数据?
- 六、如何理解TCP报头
- 七、不可靠的场景有哪些
- 八、存不存在绝对的可靠性
一、TCP协议的报文格式
二、TCP协议报文的解包和封装和分用
TCP协议的报头的标准长度默认为20byte,报头的标准长度就是除去选项部分的长度。
将TCP报文的前20个字节取出来,将这20byte的数据转为结构化的数据。提取出4位的首部长度。
4位的首部长度就是TCP报头的长度(单位为4byte),4位首部长度的取值范围为0~15,则TCP报头的长度范围 0 ~ 60 byte,但是tcp报头的标准长度为20byte,所以TCP报头长度范围应该为20 ~ 60 byte。
当tcp报头没有选项字段时,4位的首部长度应该为5(0101)。
解包:获取得到tcp报头的长度,就能将tcp报文的报头和有效载荷进行分离了。
封装:定义一个结构体的tcp报头,并给报头中的字段赋相应的值。再将报头和发送缓冲区中的应用层的数据进行拼接,就形成了tcp报文。
分离:根据tcp报头中目的端口号进行向上交付给对应的进程。
三、为什么TCP报文无需知道有效载荷的长度?
TCP协议是可靠的,是面向字节流,每个字节都有对应的序号。tcp有保证可靠的机制:确认应答机制,超时重传机制,流量控制机制,拥塞控制机制。能保证一方发送缓冲区的数据的每个字节都能有序的放入另一方的接受缓冲区。不需要知道有效载荷的长度,就能保证数据丢失有序。
四、如何通过端口号找到特定的进程呢?
操作系统内核维护以端口号为key值、进程的PCB为value的哈希表,通过哈希表查找端口号对应的进程的PCB。bind操作就是将端口号和对应的进程的PCB添加到哈希表中。
五、进程如何通过文件描述符读写传输层的数据?
传输层将TCP报文的报头和有效载荷分离,提取报头中的目的端口号,从哈希表中找到端口号对应进程PCB,根据PCB找到文件描述符表,通过文件描述符找到对应的struct file中的缓冲区,将传输层的有效载荷拷贝进文件描述符对应的文件缓冲区,应用层就可以通过文件描述符对有效载荷进行读写了。
六、如何理解TCP报头
报头就是根据协议的定制的结构化数据,本质就是操作系统内部的结构体数据。
struct tcp_hdr{
uint32_t src_port:16;
uint32_t dst_port:16;
uint32_t seq;
uint32_t ask_seq;
uint32_t header_length:4;
...
};
七、不可靠的场景有哪些
丢包:报文在网络传输过程中丢失
校验出错:通过检验和检测报文出错
乱序:数据不是有序的
重复:重复收到多个相同的报文
八、存不存在绝对的可靠性
不存在绝对的可靠性。当一个消息,对方给应答,说明这个消息一定被对方收到了。但是双方通信最后一条消息,是没有应答的,有应答就不是最后最新的一条消息,所以无法判断最后一条消息被对方收到,所以不存在绝对的应答。