网络相关问题总结

聊一下你对网络分层的理解

ISO提出的OSI模型将网络分为七层,即物理层( Physical )、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)和应用层(Application)。但是其中的会话层和表示层是可以忽略的,所以就形成了我们常见的五层网络模型,即:物理层、网络访问层、网络互联层、传输层、应用层。用一张图可以完美描述它们的关系。

image

描述一下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请求是可靠的。

发布了30 篇原创文章 · 获赞 60 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览