客户端服务器通讯过程


ip协议族.png

tcp 状态图

image.png

实线代表客户端,虚线代表服务端;

三次握手

  1. CLOSED 起始点;
  2. LISTEN 服务器端等待连接接入。服务器经过 socket,bind,listen 函数之后进入此状态,开始监听客户端发过来的连接请求;
  3. SYN_SENT 第一次握手发生阶段,客户端发起连接。客户端调用 connect,发送 SYN 给服务器端,然后进入 SYN_SENT 状态。
  4. SYN_RCVD 第二次握手发生阶段,跟 3 对应,这里是服务器端接收到了客户端的 SYN,此时服务器由 LISTEN 进入 SYN_RCVD状态,同时服务器端回应一个 ACK,然后再发送一个 SYN 即 SYN+ACK 给客户端。还有一种情况,当客户端在发送 SYN 的同时也收到服务器端的 SYN请求,即两个同时发起连接请求,那么客户端就会从 SYN_SENT 转换到 SYN_REVD 状态。
  5. ESTABLISHED 第三次握手发生阶段,客户端接收到服务器端的 ACK 包(ACK,SYN)之后,也会发送一个 ACK 确认包,客户端进入 ESTABLISHED 状态,表明客户端这边已经准备好,但TCP 需要两端都准备好才可以进行数据传输。服务器端收到客户端的 ACK 之后会从 SYN_RCVD 状态转移到 ESTABLISHED 状态,表明服务器端也准备好进行数据传输了。这样客户端和服务器端都是 ESTABLISHED 状态,就可以进行数据传输。

为什么需要 time_wait 状态?

  • 2 * MSL确保有足够的时间让被动方收到了ACK或主动方收到了被动发超时重传的FIN。即,如果被动方没有收到Ack,就会触发被动方重传FIN,发送Ack+接收FIN正好2个MSL,TIME_WAIT状态的连接收到重传的FIN后,重传Ack,再等待2 * MSL时间。

  • 确保有足够的时间让“迷途的重复分组”过期丢弃。这只需要1 * MSL即可,超过MSL的分组将被丢弃,否则很容易同新连接的数据混在一起(仅仅依靠ISN是不行的)。

连接建立与关闭

image.png

协议分层

tcpipprotocols.png

应用层

应用层决定了向用户提供应用服务时通信的活动。应用层负责处理特定的应用程序细节。
TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)服务就是其中两类。 HTTP 协议也处于该层。

传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报 协议)。
主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。
TCP 为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。为了提供可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制。
UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。UDP协议任何必需的可靠性必须由应用层来提供。

网络层

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所 起的作用就是在众多的选项内选择一条传输路线。
也称作互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。
ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。
IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。

链路层

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱 动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等 物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在 链路层的作用范围之内。
也称作数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。

数据流转

image.png

数据进入协议栈过程

OSI-Seven-Layer-Model.png

一次通信过程

电脑 A 给电脑 B 发一封邮件:

image.png

交换机在数据链路层上对数据进行转发,通过识别目标主体的MAC地址决定将数据传输到哪个链路上;

路由器在网络层对数据进行转发,也就是说路由器在转发过程中会识别传输数据的IP地址,并在链路层将IP地址转化为MAC地址传递给一个数据接收主体;

对于路由器和交换机来说,其最终都是通过mac来唯一区分一个主体的,但在路由器中,会将mac地址映射为在该局域网内唯一的ip地址,作为设备的标记。

io 过程

IO请求划分两个阶段:
1. kernel 等待数据就绪
2. 从内核缓冲区拷贝到进程缓冲区

按照请求是否阻塞
1. 同步IO
2. 异步IO

Unix的5种IO模型

  1. 阻塞IO 2. 非阻塞IO 3. IO复用 4. 信号驱动IO 5.异步 IO
    1. <br />1-4 同步IO 5 异步IO

<br /> 

image.png

io模型

网络编程 = io模型 + 协议+线程模型, java 网络编程本质上是 jvm 调用 linux 系统函数完成

linux 系统有 5 种 io 模型

image.png

无论哪种 io, 都可以分为两阶段的操作:

  1. 等待数据从磁盘或者网络到达 kernel;
  2. 将数据从 kernel 拷贝到用户空间(process)

阻塞 io

image.png

阻塞 io 要线程一直等待数据从网络到达并且拷贝到用户空间才返回,这个过程中,这个线程什么都不能做。

非阻塞 io

image.png
非阻塞IO模型下,我们发出open/read/write这样的IO操作时,这些操作不会永远阻塞,而是立即返回。非阻塞模型由于立即返回,后面需要轮询不断的查看读写是否已经就绪,然后才能进行I/O操作

io 多路复用

image.png

多个 socket 的读写操作可以阻塞到一个系统级别的系统调用函数上,比如 select,poll ,epoll 等函数 。select 可以同时对多个读/写操作的I/O函数进行检测,直到有数据可读或可写时,通知对应的进程。

io模型对比

所有的系统I/O都分为两个阶段:等待就绪和操作。举例来说,读函数,分为等待系统可读和真正的读;同理,写函数分为等待网卡可以写和真正的写。

需要说明的是等待就绪的阻塞是不使用CPU的,是在“空等”;而真正的读写操作的阻塞是使用CPU的,真正在”干活”,而且这个过程非常快,属于memory copy,带宽通常在1GB/s级别以上,可以理解为基本不耗时;

image.png

TCP Implementation in Linux: A Brief Tutorial
tcp 如何在linux 实现的: see: https://dirtysalt.github.io/html/tcp-on-linux.html

参考:
http://www.uml.org.cn/xjs/201904013.asp?artid=21820
https://www.twblogs.net/a/5c9ed434bd9eee7523888419
https://microchipdeveloper.com/tcpip:tcp-ip-five-layer-model
https://www.qingtingip.com/h_379267.html
https://blog.fudenglong.site/2017/03/23/TCP协议之三次握手与四次挥手/