OSI网络模型
互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。分别是物理层-数据链路层-网络层-传输层-会话层-表示层-应用层。
应用层
应用层只需要专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。
应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。
应用层是不用去关心数据是如何传输的。

传输层
应用层的数据包会传给传输层,传输层(Transport Layer)是为应用层提供网络支持的。 在传输层会有两个传输协议,分别是 TCP 和 UDP。 TCP 的全称叫传输控制协议(Transmission Control Protocol),大部分应用使用的正是 TCP 传输层协议,比如 HTTP 应用层协议。TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。 UDP 相对来说就很简单,简单到只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP 也可以实现可靠传输,把 TCP 的特性在应用层上实现就可以,不过要实现一个商用的可靠 UDP 传输协议,也不是一件简单的事情。 应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在 TCP 协议中,我们把每个分块称为一个 TCP 段(TCP Segment)。 当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。 由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用。
TCP头部有一个32位的序列号,是为了解决包乱序的问题。当传输的数据量超过4GB时,序号字段会回绕(wrap around)到0,不影响数据的传输和确认。
状态位总共有6种,用控制位(U、A、P、R、S、F)分别代表URG、ACK、PSH、RST、SYN和FIN位,其中
URG(Urgent Pointer field significant) 紧急数据传输,如终端用户中断数据流。当URG位被设置时,TCP段的紧急指针字段会被解释。接收方会优先处理紧急数据,尽快将其交给应用程序。
ACK(Acknowledgment field significant) 所有数据传输过程,连接建立后所有段都必须设置该位。表明确认号字段有效。发送方利用这个位来确认已经接收到的数据。
PSH(Push Function) 实时数据传输,如Telnet或SSH会话,当PSH位被设置时,接收方会立即将数据包交给应用层应用,而不是等待缓冲区被填满
RST(Reset the connection) 连接异常或意外情况,如端口关闭或连接复位,重置连接,立即终止任何现有的数据传输,并重新建立连接。
SYN(Synchronize sequence numbers) 连接建立过程(三次握手),同步序列号。初始连接请求和确认使用SYN位设置。第一次握手时客户端发送SYN,第二次握手时服务器回应SYN-ACK。
FIN(No more data from sender) 连接终止(四次挥手)。发送方完成数据传输,用于释放连接资源。第一次挥手时,发送方发送FIN,第二次挥手时接收方回应ACK,第三次挥手时接收方发送FIN,第四次挥手时发送方回应ACK。
窗口大小主要做流量控制,通信双发各声明一个窗口(缓存大小)标识自己当前能够处理的能力,除了做流量控制以外,TCP还会做拥塞控制。
网络层
传输层可能大家刚接触的时候,会认为它负责将数据从一个设备传输到另一个设备,事实上它并不负责。 网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。 网络层负责将数据从一个设备传输到另一个设备,世界上那么多设备,又该如何找到对方呢?因此,网络层需要有区分设备的编号。只有一个单纯的 IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道一个一个去匹配?这显然不科学。因此,需要将 IP 地址分成两种意义:
一个是网络号,负责标识该 IP 地址是属于哪个「子网」的;
一个是主机号,负责标识同一「子网」下的不同主机; 将IP地址和子网掩码进行按位与运算,就可以得到网络号 将IP地址和子网掩码的取反值进行按位与运算,就可以得到主机号 主机号位全是1的地址为此网段的广播地址,全是0时表示该网络的网络号 在寻址的过程中,先匹配到相同的网络号(表示要找到同一个子网),才会去找对应的主机. 除了寻址能力, IP 协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,那么就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。路由器寻址工作中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。
网络接口层
生成了 IP 头部之后,接下来要交给网络接口层(Link Layer)在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。 电脑上的以太网接口,Wi-Fi接口,以太网交换机、路由器上的千兆,万兆以太网口,还有网线,它们都是以太网的组成部分。以太网就是一种在「局域网」内,把附近的设备连接起来,使它们之间可以进行通讯的技术。 以太网在判断网络包目的地时和 IP 的方式不同,因此必须采用相匹配的方式才能在以太网中将包发往目的地,而 MAC 头部就是干这个用的,所以,在以太网进行通讯要用到 MAC 地址。 MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息,我们可以通过 ARP 协议获取对方的 MAC 地址。 网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。
MAC包头中的协议类型只包括两种,一种是ip协议,一种是arp协议
数据包流转

应用层传输的是消息或报文(message)
传输层传输的是段(segment)
网络层传输的是包(packet)
网络接口层传输的是帧(frame)
统称为数据包。

应用层不关心数据是如何传输的,主要关注专注于为用户提供应用功能,不会数据不会进行切割,工作在操作系统中的用户态。应用层需要传输的数据可能会很大,如果直接传输不好控制,因此当传输层的数据包大小超过MSS(TCP报文的最大长度)时,就要将数据进行分段,即使一个数据块丢了或者损坏,只需要重传即可。 传输层的分段大小MSS由以下几个因素决定:
最大传输单元 MTU是网络层可以传输的最大数据包大小。常见的以太网MTU是1500字节,这包括IP头和TCP头。因此,TCP报文段的最大大小受到MTU的限制。
最大报文段长度(MSS) MSS是TCP协议中的一个选项,用于指定单个TCP报文段可以传输的最大数据量。MSS的计算基于MTU减去IP和TCP头的长度。常见的MSS值为1460字节(针对IPv4,以太网环境)或1440字节(针对IPv6,以太网环境)。在TCP连接建立时,通过三次握手过程,双方会交换并协商MSS值。
拥塞控制和流量控制 TCP协议通过拥塞控制和流量控制机制(如滑动窗口、慢启动等)来动态调整报文段大小和传输速度,以避免网络拥塞和确保可靠传输。这些机制会影响实际传输的报文段大小。
应用层协议的要求 某些应用层协议可能会指定或建议特定的报文段大小,以优化传输效率或满足特定的应用需求。 数据经过分段后,加入TCP头部,然后来到网络层,在网络层添加ip头部,然后在数据链路层再添加mac头部。 MTU = IP头部 + TCP头部 + MSS MTU:Maximum Transmission Unit,网络层(如 IP 层)可以传输的最大数据包大小。不同的网络介质有不同的 MTU 值。 MSS:Maximum Segment Size,指的是每个 TCP 段(Segment)中数据部分的最大大小。 一般TCP头部为20个字节 一般IP头部也为20个字节 MAC头部为14个字节