计算机网络——理解TCP/IP网络协议栈

1. 网络七层模型

网络七层模型


image.png
计网各层协议.jpg
2. TCP建立连接、断开连接

SYN包用于初始化包序号,用来解决网络包乱序问题。
ACK包用于确认收到,用来解决不丢包的问题。

3次握手,4次挥手 图解

image.png

建立连接
第一次握手
Client将标志位SYN置1,随机产生一个值seq=J,并将数据包发给Server
Client进入SYN_SENT状态,等待Server确认
第二次握手
Server收到数据包后标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置1,随机产生一个值,并将数据包发给Client确认连接请求,Server进入SYN_RCVD状态
第三次握手
Client收到确认后若ACK为1,则将该数据包发送给Server,Server检查ACK为1则连接建立成功,Client与Server进入ESTABLISHED状态完成三次握手,可以传输数据
其实也可以理解客户端还有一次ack,但是这一次直接就发送数据了顺带ack了

image.png

如果第三次握手失败会发生什么?
可以看出当失败时服务器并不会重传ack报文,而是直接发送RTS报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。详见
具体参考:https://yuanrengu.com/2020/77eef79f.html
https://www.cnblogs.com/heyonggang/p/3386415.html

断开连接

image.png

为什么建立连接是三次,断开连接是4次?
建立连接的时候服务端收到客户端建立连接的请求后,同时向客户端发送了同意建立连接和SYN的包,然后客户端接收后回复一次OK,那么TCP的全双工通道连接就建立了;而在断开连接的时候这两个通道要分别断开。因为这两个通道是一模一样的都可以发送接收,所以要分别断开。
自己的理解
全双工可以理解为逻辑上的两个通道:A主动发送,B接收和B发送,A接收两个,但是实际都是一个通信线路,所以当A不在主动发送数据要关闭时,就发起请求,但可能B还要继续发送,连接不能断开,所以为了不丢包,B也要向A回复这个请求关闭包,这时就是半关闭状态,这已经发送两个包了,然后等B也发送完数据,在向A发送一个请求关闭包,A回复确认,通道完全关闭,结束通信,所以是4次

image.png

3. TCP超时重传
image.png

image.png

image.png

image.png

image.png
4. TCP滑动窗口
image.png

image.png

image.png
5. TCP拥塞控制
image.png

image.png

image.png

image.png

image.png

TCP Nagle算法
nagle算法用于处理小报文段(微小分组)的发送问题
nagle算法的核心思想是允许网络中最多只能有一个小分组被发送,而待发送的其它小分组会被重新分组成一个”较大的”小分组,等收到上一个小分组的应答后再发送
nagle算法可以减少网络中微小分组的数量,比如客户端需要依次向服务器发送大小为1,2,3,1,2字节的5个分组
在没有开启nagle算法的情况下,这些小分组会被依次发送(不需要等待上一个小分组的应答,因为没启动nagle),总共发送的报文段(分组)个数为5
当开启nagle算法时,客户端首先发送大小为1字节的第一个分组,随后其它分组到达发送缓冲区,由于上一个分组的应答还没有收到,所以TCP会先缓存新来的这4个小分组,并将其重新分组,组成一个大小为8(2+3+1+2)字节的”较大的”小分组。当第一个小分组的应答收到后,客户端将这个8字节的分组发送。总共发送的报文段(分组)个数为2
当传输数据存在大量交互数据时,nagle算法可以有效减少网络中的报文段个数

在TCP协议: 累积确认 和 捎带确认
累积确认
有时候,发送方发送速度非常快,接收方一下下接收到了好几个 tcp 段,可以通过累积确认的方式,一次确认好几个 tcp 段,这样减少报文段的传输。
捎带确认
有时候,双方互相发送数据,当接收到对方的 tcp 段后,先不着急确认,而是等待一会儿,连同数据和 ack 一起发送过去,这种情况叫捎带确认。如果等了一会儿(到时间了),接收方还没有数据要发送,那就直接回复一个纯 ack 过去,这样的 ack 称为延时的 ack(Delayed ACK)。
如果没有上述情况发生,ack延迟会等待多久发送呢?在linux上,所有的延时的 ack,延时时间都在 40 ms 左右(从收到数据到发送 ack 之间的时间)。
有没有禁止的延迟确认的方法,毕竟在实时性很高的场景,我们还是希望ack不要延迟的。有,tcp TCP_QUICKACK选项,不过好像这个选项的资料不是很多,貌似是一个附加选项。
我们看到TCP_NODELAY是针对Nagle算法的,而不是延迟确认,不要被字面意思误导。

理解TCP/IP网络协议栈,发送数据,接收数据详细流程

Understanding TCP/IP Network Stack
The Send Case

image

The Steps for Sending a Single Ethernet Frame

  1. The host operating system is informed that a frame is in host memory and is ready to be sent. The OS builds a buffer descriptor regarding this frame in host memory.
  2. The OS notifies the NIC that a new buffer descriptor is in host memory and is ready to be fetched and processed. This is typically referred to as a "mailbox" event.
  3. The NIC initiates a direct memory access (DMA) read of the pending buffer descriptor and processes it.
  4. Having determined the host address of the pending frame, the NIC initiates a DMA read of the frame contents.
  5. When the all segments of the frame (which may use several buffer descriptors and buffers) have arrived, the NIC transmits the frame out onto the Ethernet.
  6. Depending on how the OS has configured the NIC, the NIC may interrupt the host to indicate that the frame has completed.

The Receive Case

image

The Steps for Receiving a Single Ethernet Frame

For these steps, it's presumed that the OS has already created buffer descriptors that point to free regions in host memory and that the NIC has read these buffer descriptors into local NIC memory via DMA.

  1. The NIC receives a frame from the network into its local receive buffer.
  2. Presuming there is enough host memory available for this received frame, the NIC initiates a DMA write of the frame contents into host memory. The NIC determines what the starting host address is by examining the next free buffer descriptor (which it has previously fetched).
  3. The NIC modifies the previously fetched buffer descriptor regarding the space that the new frame now occupies; the NIC fills in the frame length and possibly checksum information. After modifying this buffer descriptor, the NIC initiates a DMA write of it to the host.
  4. Depending on how the OS has configured the NIC, the NIC may interrupt the host to indicate that a frame has arrived.
6. 网络IO模型

IO有两种操作,同步IO和异步IO。同步IO指的是,必须等待IO操作完成后,控制权才返回给用户进程。异步IO指的是,无需等待IO操作完成,就将控制权返回给用户进程。

4种网络IO模型
阻塞和非阻塞的区别?
阻塞和非阻塞描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,不需要等到IO操作彻底完成。

阻塞IO模型

image.png

非阻塞IO模型
image.png

多路复用IO模型
image.png

异步IO模型
image.png

对比
image.png

非阻塞IO和异步IO的区别
非阻塞IO,虽然进程大部分时间都不会被阻塞,但它仍然要求进程去主动检查,并且当数据准备完成以后,也需要进程主动地再次调用recvfrom来将数据拷贝到用户内存中。而异步IO则完全不同,他就像是用户进程将整个IO操作交给内核完成,然后内核做完后发信号通知。在此期间,用户进程不需要检查IO操作的状态,也不需要主动地拷贝数据。
epoll,poll和select的区别
image.png

image.png

7. 网络分析工具

四个网络分析工具:ping、tcpdump、netstat和lsof
ping

ping 会发送一个icmp(因特网信报控制协议),用来检查网络是否通畅或者网络连接速度的命令。
ping检查的六个步骤
1)使用ipconfig/all观察本地网络设置是否正确。
2)ping 127.0.0.1,来检查本地的TCP/IP协议有没有设置好;
3)ping本机IP地址,检查本机IP地址是否设置有误
4)ping本网网关或者IP地址,检查硬件设备是否有问题,也可以检查本机和本地网络连接是否正常
5)ping本地DNS地址,这样做是为了检查本地DNS服务器是否正常工作
6)ping远程IP地址,检查本网或本机与外部的链接是否正常。

tcpdump
tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句进行筛选。

tcpdump [-adeflnNOpqStvx]  [-c 数量]  [-F 文件名]
               [-i 网络接口]  [-r 文件名]  [-s 
 snaplen]
               [-T  类型]  [-w 文件名]  [表达式]

表达式是一个正则表达式,表达式中一般包含几个关键字,如下:

1)关于类型的关键字,主要包括host、net、port等,例如host 127.0.0.1即指明这是一个主机,net 202.0.0.0指明202.0.0.0是一个网络地址,port 23指明端口号是23;默认是host。
2)确定传输方向的关键字,主要包括src、dst、dst or src等;
3)协议的关键字,主要包括fddi、ip、arp、rarp、tcp、udp等类型。
除了这3种类型的关键字之外,还有gateway、broadcast、less、greater等,还有三种逻辑运算:取非运算not/!,与运算and/&&,或运算or/||。

netstat
用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接、对TCPhenomenonUDP的监听及获取进程内存管理的相关报告。

image.png

lsof
losf(list open file)是一个列出当前系统打开文件的工具。

image.png

lsof各列信息的意义如下
1)COMMAND:进程的名称
2)PID:进程标识符
3)USER:进程所有者
4)FD:文件描述符
5)TYPE:文件类型
6)DEVICE:指定磁盘的名称
7)SIZE:文件的大小
8)NODE:索引节点
9)NAME:打开文件的确切名称
image.png

你可能感兴趣的:(计算机网络——理解TCP/IP网络协议栈)