阅读 小册子 深入理解TCP协议 后 感知

379 阅读5分钟

之前总是对于TCP协议似懂非懂的样子,终究是对于某些东西理解的不深刻,这次对张师傅文章的阅读,部分知识得到了进一步的加深,但是很有部分文中所展示并不是很详细,特此对于一些知识标出探讨下:

1.对于基本点 TCP是面向连接的,可靠的,基于字节流的传输协议,文中所说保证可靠性主要依靠以下几个方面:

每个包提供校验和,包的序列号解决了乱序,重复包问题;超时重传;流量控制,拥塞控制

对于校验和,在TCP包头使用了两个字节设置校验和,文中指出了这点,但没详细说明具体怎么校验:我的理解是 将TCP头部校验和2位置为0之后各个头部相加最后取反放入到校验和位,接受放对所有进行相加结果为0则校验成功;描述的不好,看到的有更易懂的描述语言评论中指出。

2.文中说 面向字节流这块时候,说了流是没有边界的,发送端write次数与接收端read次数是没有关系的,具体取决于路径最大传输单元MTU,发送窗口大小,拥赛控制等; 在一次面试的过程中,被文档过这个问题,什么情况下内核缓冲区会一次性发送完毕,什么情况下会发送2次?希望了解的大佬能够留言评论探讨。

3.再读到链路层传输单元限时时,文中说到一帧数据最小64字节,最大1518字节;但要取出头部14字节和检验和4字节,所以链路层最大传输单元是1500字节;如果传输100k字节 ,需要100*1024/1500=69以太网帧;ip段最大报文是65536字节,远远大于以太网1500字节,所以IP段会分段,IP头部有个偏移量就是为分段做准备的。IP层没有TCP超时重传的等,所以丢包后很可能出现整包重传,浪费带宽,在TCP层一般都会把数据包控制在1500字节以内,TCP 最大报文段 MSS = MTU-IP头-TCP头;这样一个MSS正好可以放到MTU里面避免了IP分段传输。

4.关于TCP握手时 初始化序列号生成方式:以四元组(源ip,目的ip,源端口,目的端口)+当前时间戳动态增长的ISN;出于安全考虑,ISN不能设置为固定值,容易被伪造RST,强制关闭连接;设置SO_REUSEADDR后,ISN动态增长,可以分辨出当前帧的包是属于旧的连接还是新的连接,不会出现串包;三次握手除了交换彼此的序列号,还交换一些辅助信息:最大段大小MSS,窗口大小Win等。

5.关于SYN占用一个序列号的问题:凡是消耗序列号的报文段,都需要对端进行确认。

6.阅读了关于TCP的自连接,涨知识了。

7.关于FIN消耗一个序列号:如果FIN不消耗一个序列号,那么如果发送完100字节包后又发送了FIN,收到ACK时无法辨别是哪个的ACK。

8.timestamps选项:TCP头部时间戳选项,在SYN时,发送放时间戳放进tsval,对方返回时,将发送方时间戳放进tsecr,新的时间戳放入到tsval中,这样的目的有两个方面:1 方便计算两端往返时延RTT 2序列号回绕。

9.为了充分利用多核处理能力,多进程处理网络请求采用以下模式:主进程+多个子进程监听相同的端口,多进程+REUSEPORT; 主进程+多个子进程监听相同的端口带来的问题是惊群问题:多个进程或线程被唤醒,最终只有一个进程或者线程处理逻辑,其他进程或线程继续睡眠;造成CPU的资源浪费;linux中epoll惊群和accept惊群。内核中wq_flag_exclusive解决了accept惊群问题。

10.内核为所有监听的socket准备了一个大小为32的哈希桶,监听的端口通过hash存放到不同的桶里面,相同的桶用链表连接,收到一个SYN时根据端口hash到某一个桶中遍历链表匹配socket连接。

11.SO_linger 结构体:onoff =0,尝试将缓冲区数据发送完毕后调用close(),onoff=1,l_linger = 0,立马RST连接,丢弃缓冲区内的数据;onoff=1,l_linger=N,N秒内发送缓冲区内的数据,之后调用close

12.Nagle算法:Nagle算法作用是有效地减少网络上小包的数量。主要在发送端:发送一个包不需要等待,后面的包等到满足一个MSS大小或者收到上一个ACK

13.延迟确认:如果收到一个包,此时没有数据发送给对端,可以等一段时间再确认;如果有数据,ack和数据一块发送过去。

14.惊群问题:多进程同时监听同一个套接字,当有网络事件发生时,所有的进程都会被唤醒,但是只有一个进程处理这个网络事件,其他的进程会重新进入睡眠。惊群问题带来的是CPU和资源的浪费,linux上分为epoll惊群和accept惊群。

15.文件描述符:进程维护该进程打开文件的记录表;每个进程都会维护一个文件描述符指向打开的描述符表,表的每一列指向文件表,文件表是每个打开文件所拥有的,所用进程共用,使用引用计数,文件表有一项指向V-Node表,V-node存放文件的信息。

详情可以阅读原作者小册子,这些是我阅读后随笔记录的一些内容