无痕
召唤看板娘

计算机网络

计算机网络

应用层

最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。那么,当两个不同设备的应用需要通信的时候,应用就把应用数据传给下一层,也就是传输层。 所以,应用层只需要专注于为用户提供应用功能,不用去关心数据是如何传输的,就类似于,我们寄快递的时候,只需要把包裹交给快递员,由他负责运输快递,我们不需要关心快速是如何被运输的。 而且应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。

传输层

应用层的数据包会传给传输层,传输层(Transport Layer)是为应用层提供网络支持的。

在传输层会有两个传输协议,分别是TCP和UDP。 TCP的全称叫传输层控制协议(Transmission Control Protocol),大部分应用使用的正是TCP传输层协议,比如HTTP应用层协议。TCP相比UDP多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。 UDP就相对很简单,简单到只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP也可以实现可靠传输,把TCP的特性在应用层上实现就可以,不过要实现一个商用的可靠UDP传输协议,也不是一件简单的事情。 应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过MSS (TCP最大报文段长度),就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新这一个分块,而不用重新发送整个数据包。在TCP协议中,我们把每个分块称为一个TCP段(TCP Segment) .

网络层

网络

数据链路层

实际场景中,网络并不是一个整体,比如你家和我家就不属于一个网络,所以数据不仅可以在同一个网络中设备间进行传输,也可以跨网络进行传输。 一旦数据需要跨网络传输,就需要有一个设备同时在两个网络当中,这个设备一般是路由器,路由器可以通过路由表计算出下一个要去的IP地址。 那问题来了,路由器怎么知道这个P地址是哪个设备的呢? 于是,就需要有一个专门的层来标识网络中的设备,让数据在一个链路中传输,这就是数据链路层(Data Link Layer),它主要为网络层提供链路级别传输的服务。

物理层

网络的传输是需要介质的。一个比特数据包从一个端系统开始传输,经过一系列的链路和路由器,从而到达另外一个端系统。这个比特会被转发了很多次,那么这个比特经过传输的过程所跨越的媒介就被称为物理媒介(phhysical medium),物理媒介有很多种,比如双绞铜线、同轴电缆、多模光纤榄、陆地无线电频谱和卫星无线电频谱。其实大致分为两种:引导性媒介和非引导性媒介。

TCP三次握手

TCP四次挥手

为什么挥手需要四次?

再来回顾下四次挥手双方发FIN包的过程,就能理解为什么需要四次了。 ·关闭连接时,客户端向服务端发送(FIN时,仅仅表示客户端不再发送数据了但是还能接收数据。 服务器收到客户端的 FI报文时,先回一个ACK、应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FTN 报文给客户端来表示同意现在关闭连接。 从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK和 FIN一般都会分开发送,从而比三次握手导致多了一次。

为什么TIME_WAIT等待的时间是 2MSL?

NSL是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为TCP报文基于是P协议的,而P头中有一个(TTL字段,是IP数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为О则数据报将被丢弃,同时发送TCMP报文通知源主机。 MSL与TTL的区别: MSL的单位是时间,而TTL是经过路由跳数。所以MSL应该要大于等于TTL消耗为О的时间,以确保报文已被自然消亡; TIME WAT等待2倍的 MSL,比较合理的解释是:网络中可能存在来自发送方的数据包当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待⒉倍的时间。 比如,如果被动关闭方没有收到断开连接的最后的ACK报文,就会触发超时重发Fin 报文,另一方接收到FN后,会重发ACK给被动关闭方,一来一去正好2个MSL. 2NSL的时间是从客户端接收到FIN后发送 ACK开始计时的。如果在TME-WAT时间内,因为客户端的ACK没有传输到服务端,客户端又接收到了服务端重发的FIN报文,那么2MSL 时间将重新计时。 在Linux系统里(2wsL默认是 60秒,那么一个 NSL也就是 30秒。Linux系统停留在TIMEWAIT的时间为固定的60秒。其定义在Linux内核代码里的名称为TCP_TIMEWAIT_LEN: 1 #define TCP_TIMEWAIT_LEN (60HZ) / how long to wait to destroy TIME-WAIT2 state, about 6e seconds*/ 如果要修改TIME_WAIT的时间长度,只能修改Linux内核代码里TCP_TIMEWAIT_LEN的值,并重新编译Linux内核。

end
留言