网络相关问题总结
聊一下你对网络分层的理解
ISO提出的OSI模型将网络分为七层,即物理层( Physical )、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)和应用层(Application)。但是其中的会话层和表示层是可以忽略的,所以就形成了我们常见的五层网络模型,即:物理层、网络访问层、网络互联层、传输层、应用层。用一张图可以完美描述它们的关系。
描述一下TCP协议?
TCP协议是一个面向连接的、可靠的、基于字节流的、全双工的协议。
- 1.面向连接的:面向连接的协议要求正式发送之前需要通过“握手”建立一个逻辑连接,结束通信时也需要通过有序的四次挥手来断开连接。而无连接的协议则不需要。
-
2.可靠的:IP协议是一种无连接、不可靠的协议,它尽最大可能把数据传输给接收方,它不能保证接受方是否能够接收到数据,也不保证包是否重复。而TCP是基于IP基础之上的协议,所以如果它需要保证连接的可靠性,主要包括以下几方面:
- 提供包的校验和。每个TCP包的首部都会有两个字节来表示校验和,它用来保存包的大小,防止包在传输过程中丢失,如果校验时发现包有丢失问题,则直接放弃这个包。
- 提供包的***。包的***解决了数据乱序和重复问题。当我们发送一个TCP包过大时,会被自动把它拆分成几个包,由于每个包到达时间不是有序的,或者由于网络原因导致包重复发送的问题,接收方都可以通过包的***来解决这些问题。
- 超时重传。TCP发送数据后会起一个定时器,等待对方确认收到这个数据包,如果指定时间内没收到ACK包就会进行重传,然后等待更长时间,再多次重传失败后才会丢弃这个包,从而保证可靠性。
- 流量控制。
- 拥塞控制。
- 3.面向字节流:TCP是面向字节流的协议,流的含义就是报文没有边界。当我们往传输流里面写数据时,它会先放到缓冲区,最终会以多少个报文发出去是不确定的,同理,接收方也是一样,它会从传输流里面的读数据,由于发送方的报文数量不确定性,所以每次读取的报文数量也不确定。
- 4.全双工的:TCP协议的发送端和接收端可以是客户端/服务器端,也可以是服务器端/客户端,通信双方在任意时刻既可以发送数据,也可以接收数据,每个方向的数据流都独立管理***、滑动窗口大小、MSS 等信息。
TCP提供了一种字节流服务,而收发双方都不保持记录的边界。应用程序如何提供它们自己的标识?
很多Internet应用使用一个回车和换行来标记每个应用记录的结束;另外一种技术是在每个记录之前加上一个记录的字节计数,DNS和RPC采用了这种技术。
为什么说Http是可靠的数据传输协议?
HTTP是属于应用层的协议,TCP(传输控制协议)和UDP(用户数据报协议)是属于传输层的协议。
我们都知道TCP协议是面向连接的,每次进行连接都要进行三次握手和四次挥手,所以它的连接是可靠的。而HTTP是在TCP上层的协议,所以它也是可靠的。
那为什么TCP可靠?
首先来讲一下网络的分层,因特网协议可以分为五层,分别是:
应用层->传输层->网络互联层->网络访问层->物理层
或许你觉得很抽象,但是通过栗子你就会发现并没有那么复杂。
如访问一个Http请求:http://45.124.252.66:9090/main/
怎么访问到这个网站呢?首先我们需要通过网络,可能是移动网或者宽带网等(这就是物理层,它是一个传输介质),然后找到对应那一台被我们访问的服务器的mac地址(网络访问层)进行连接,再匹配它的IP(网络互联层)是否对应,确定了主机后,再通过端口号9090(传输层)访问对应的进程,由于一个进程里面有很多业务模块,而我们需要访问main模块(应用层),最终通过不同层来实现网站的访问。
每个层都是相互独立,并且向下依赖,而传输层是能确定唯一主机的,因为我们可以通过mac地址、host和端口来确定唯一的一台主机,所以它是可靠的。后续有的人会问,那如果网络中断呢?那不就不可靠了吗,我们常说的网络中断是属于物理层,由于是向下依赖,传输层的建立是依赖于下面的三层(网络互联层、网络访问层、物理层)是可靠的,如果下面的层都没有连接成功,也就没有传输层这一说了。
我们通过分层了解了传输层是能够连接上唯一的主机,那么怎么保证一个请求是可靠的呢?
那就要讲到三次握手和四次挥手的作用了。
三次握手就是在建立连接之前需要客户端需要先给服务端发出SYN©报文,当服务器收到后需要返回客户端ACK=SYN©+1,并且传输自己生成的SYN(s)给客户端,客户端收到后进入已连接状态,需要再回一个ACK=SYN(s)+1给服务器,服务器收到ACK后也进入了连接状态,这就是一个三次握手的过程,通过双方进行三次通信保证此时双方都已经进入准备状态。
四次挥手就是在结束连接的时候,客户端会发送FIN©给服务器,服务器收到后回复客户端ACK=FIN©+1告知客户端收到客户端的结束请求了,这时客户端就会进入CLOSING(半关闭状态),等待服务器的结束请求。 在一段小延迟时间后,服务器也会发送一个FIN(s)请求给客户端,客户端收到后发送ACK=FIN(s)+1给服务器,服务器收到ACK后就进入技术状态。客户端在等待2个MSL(避免服务器收不到ACK)后也进入结束状态。
在每次进行连接和断开连接都需要经过复杂的三次握手和四次握手,从而保证了每个连接都是可靠的,所以TCP协议是可靠的,而HTTP就是TCP上层的协议,所有连接都是基于TCP协议的。
在我们能够确定每个请求对应的唯一主机和端口号,并且通过Http协议添加响应的请求数据信息(如模块名字等)确定请求的代码位置,并且在每次请求都通过三次握手和四次挥手保证连接的可靠性,所以一个Http请求是可靠的。