网络第一篇

说说OSI模型和TCP/IP模型

在这里插入图片描述

TCP是如何保证数据可靠的

通过数据流的方式传输,将数据截成合理的长度;
对每段报文进行编号,保证数据流的顺序;
收到数据进行重排序,并且丢弃重复数据;
收到报文后,给出确认响应;
超时重发;
校验和;
流量控制(针对本程序的接受能力)和拥塞控制(针对整个网络)。

TCP为什么会有粘包和拆包问题?如何解决?

出现的原因

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它保证了数据传输的可靠性和顺序性,但由于以下特性,可能会出现粘包或拆包的现象:
发送方的 Nagle 算法:为了减少网络中小分组的数量,Nagle算法会将多个小的TCP段累积到一定大小后再一起发送。
接收方的 TCP 接收缓冲区:数据在传输过程中可能会被缓存,直到缓冲区满或超时,然后一次性发送给应用层。
网络中的 MTU(最大传输单元)和 MSS(最大分段大小)限制:大的数据包会被分割以适应网络中的MTU限制,而接收方可能会在收到所有分段之前就开始处理已接收的数据。
TCP流量控制和拥塞控制机制:这些控制机制可能导致数据被分批发送或接收。

解决方法

设置边界标识:在应用层协议中定义数据包的边界,例如使用特殊字符或字符串作为每个数据包的分隔符。
固定长度:规定每个数据包的长度固定,接收方根据固定长度接收和处理数据。
长度字段:在数据包的头部加入长度字段,明确指定数据的长度,接收方根据这个长度字段来确定数据包的界限。
组合方法:在应用层使用以上方法的组合,例如先发送长度字段,然后发送实际数据。
应用层协议设计:设计一个更为复杂的应用层协议,如HTTP/2,它具有帧(frame)的概念,每个帧都有其类型和长度,从而避免粘包和拆包问题。
通过这些方法,可以确保数据包在应用层正确无误地被识别和处理,即使在底层的TCP协议中出现了粘包或拆包现象。

键入网址到网页显示,期间发生了什么?

  1. URL解析
    当用户在浏览器中键入网址(即统一资源定位符URL)时,浏览器首先解析URL以确定目标服务器的地址和请求的资源。
  2. DNS查询
    浏览器通过域名系统(DNS)查询将网址中的域名转换为服务器的IP地址。如果DNS信息已经缓存在本地,则不需要进行查询。
  3. 建立连接
    浏览器根据解析得到的IP地址尝试与服务器建立连接。如果是HTTPS网址,这一步将包括TLS/SSL握手过程。
  4. 发送HTTP请求
    一旦建立了连接,浏览器会构造一个HTTP(或HTTPS)请求,并将其发送到服务器。请求包括所需资源的路径、请求方法(如GET或POST)和头部信息。
  5. 服务器处理请求
    服务器接收到请求后,会根据请求的资源类型和方法进行处理。服务器可能会查询数据库、执行后端逻辑或直接检索静态资源。
  6. 服务器响应
    处理完成后,服务器会构建一个HTTP响应消息,包括状态码(如200 OK表示成功)、响应头部信息和请求的资源内容。
  7. 浏览器接收响应
    浏览器接收服务器的响应并根据状态码进行不同的处理。如果是成功的响应,浏览器将开始读取响应内容。
  8. 渲染网页
    浏览器解析响应内容,通常是HTML文档,并根据CSS样式和JavaScript脚本构建和渲染网页。
  9. 加载资源
    如果网页中包含额外的资源,如图片、视频、CSS文件或JavaScript文件,浏览器将发出额外的HTTP请求来加载这些资源。
  10. 网页交互
    一旦所有资源都被加载和执行,网页就完成了渲染,用户可以与页面进行交互。
    这个过程涉及到客户端(浏览器)、网络和服务器端的多个步骤,每一步都是确保用户请求的网页能够正确显示的关键环节。

两台主机的通信过程?

1.数据封装
首先会在其操作系统的网络栈中封装数据。这涉及将数据分割成小块(如果需要的话),并加上适当的网络层(如IP)、传输层(如TCP或UDP)和链路层(如以太网)的头部信息。
2.数据发送到交换机或路由器
交换机使用MAC地址来决定如何在局域网内转发数据包。
如果目标电脑与发送主机在同一个局域网(LAN)内,交换机会直接将数据包转发到正确的设备。如果不在同一个LAN内,交换机会将数据包转发到连接的路由器。
3.路由决策
路由器解析数据包中的IP地址,根据路由表决定下一跳的地址。如果目标电脑在不同的网络,路由器会将数据包转发到下一个路由器或者直接到目的网络(如果是直接连接的)。
4.通过目标交换机到达目的地
当数据包通过可能的多个路由器和网络到达目标电脑所在的局域网时,它会先到达该网络的交换机。这个交换机再次使用MAC地址来确定如何将数据包最终传递给目标电脑。
5.数据解封装与处理
目标电脑收到数据包后,它的网络栈会处理并解封装数据包,移除链路层、网络层和传输层的头部,最终将原始数据传递给相应的应用程序。

TPC三次握手建立连接?为什么是3次?

TCP三次握手建立连接

在这里插入图片描述

TCP三次握手过程
TCP(传输控制协议)三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送三个包以确认连接的建立。在这个过程中,客户端和服务器交换同步(SYN)和确认(ACK)消息,确保双方都准备好进行数据传输。
第一次握手(SYN):
客户端发送一个TCP的SYN标志位的数据包到服务器以初始化连接请求。
在这个数据包中,客户端会随机选择一个序列号(Seq=x)。
第二次握手(SYN-ACK):
服务器收到客户端的SYN请求后,需要确认客户端的SYN(ACK=x+1),同时自己也发送一个SYN请求(Seq=y),即SYN-ACK数据包。
第三次握手(ACK):
客户端收到服务器的SYN-ACK后,会发送一个确认包(ACK=y+1),这个包发送完毕后,客户端和服务器端都会确认对方已准备好接收数据,完成三次握手,建立连接。

为什么是三次握手

三次握手是为了可靠地建立一个TCP连接,主要解决以下几个问题:
确认双方的接收能力和发送能力:
三次握手过程中,双方都发送了SYN来建立连接,同时也对对方的SYN进行了ACK的确认。这个过程确保了双方都有发送数据和接收数据的能力。
同步序列号:
TCP连接中的数据传输是基于序列号的,它们能够确保数据的有序性。三次握手可以帮助客户端和服务器端同步各自的初始序列号。
防止失效的连接请求到达服务器:
如果只有两次握手,则可能会出现已经失效的连接请求被服务器接受,从而打开一个无用的连接,浪费服务器资源。三次握手通过确认和同步机制,减少了这种情况的发生。
初始化连接参数:
在握手过程中,TCP的一些重要参数被初始化,如窗口大小(用于流量控制)和最大报文段长度(MSS)。
因此,TCP三次握手是一个设计上的折中,它在保证连接的可靠性和尽可能减少开销之间取得平衡。虽然理论上两次握手也能建立连接,但它不能解决上述提到的问题,特别是在网络延迟较大的情况下。三次握手提供了一个稳健的方法来建立一个可靠的连接。

TCP四次挥手断开连接?为什么是4次?

TCP四次挥手断开连接

在这里插入图片描述

TCP四次挥手过程
TCP连接的断开比建立连接更复杂,需要四次挥手。这个过程确保双方都能够完全关闭连接。以下是四次挥手的详细步骤:
第一次挥手(FIN):
客户端决定关闭连接,发送一个FIN(结束)标志位的数据包给服务器,表示客户端已经没有数据发送了,但仍然可以接收数据。
第二次挥手(ACK):
服务器收到这个FIN标志的数据包,发送一个ACK(确认)响应,确认收到了客户端的断开请求,但服务器可能还有数据需要发送给客户端,所以连接还没有立即关闭。
第三次挥手(FIN):
服务器发送完剩余的数据后,它会发送一个带有FIN标志位的数据包给客户端,告诉客户端它的数据已经全部发送完毕,并且服务器希望关闭连接。
第四次挥手(ACK):
客户端收到服务器的FIN请求后,发送一个ACK确认,之后进入TIME_WAIT状态。客户端会等待足够的时间以确保服务器接收到了最终的ACK响应。这个时间通常是一个最大报文段生存时间(MSL)的两倍。在此之后,客户端和服务器都释放连接,完成断开过程。

为什么client要等待 2MSL 后才断开连接?

MSL的定义
MSL(Maximum Segment Lifetime)是指任何TCP段(报文段)在网络中的最大生存时间。它是一个时间限制,用于确保TCP段在网络中不会无限期地存在。通常,MSL被设定为2分钟。
2MSL等待的目的
当TCP连接正在关闭时,客户端在发送最后一个ACK响应后需要等待2倍的MSL时间(2MSL),这个等待过程的目的包括:
确保最后一个ACK报文能够到达:如果客户端的最后一个ACK报文在网络中丢失,服务端将不会收到对其FIN报文的确认,因此服务端会重传FIN报文。客户端在2MSL时间内等待,可以确保有足够的时间来接收可能重传的FIN报文,并再次发送ACK报文。
等待时间超过所有报文段的生命周期:这样可以确保当前连接中传输的所有TCP报文段在网络中都已消失,防止这些旧的报文段出现在后续的新连接中,从而可能导致数据混淆。
允许服务端正常过渡到CLOSED状态:如果服务端没有收到最后的ACK,它会重试FIN+ACK的发送。2MSL的等待期允许这一过程顺利完成,确保双方都能够清理并关闭连接。
防止TIME_WAIT状态的端口立即被重用:通过等待2MSL,TCP协议避免了新的连接可能使用了旧连接的端口号,但网络中仍然存在旧连接的数据包的情况,这样的话新旧连接的数据就会混淆。
结论
2MSL等待是TCP协议中设计的一个机制,用于确保连接可靠地终止,避免可能的数据传输错误,并允许网络中可能延迟的数据包自

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值