zoukankan      html  css  js  c++  java
  • TCP/IP简记

    作为一个非科班的前端er,计算机网络基础和原理方面一直都是自己比较薄弱的环节,最近学习了一些相关的知识便记录一下。

    简介

    tcp/ip:我们通常所说的tcp/ip协议,指的是以TCP(传输控制协议)和IP(网际协议)为核心的TCP/IP协议族。TCP/IP也称互联网协议,是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。

    计算机网络体系结构的分层

    根据不同的模型,我们将计算机网络中的协议分为不同的层级。最常见的有OSI七层参考模型和TCP/IP四层模型。

    数据的传输

    互联网协议规定了数据(包)的发送从上层到下层,每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,明确标明了协议应该如何读取数据。

    数据的接收则从下层到上层,每个分层中,都会对接收的数据进行处理,根据包首部,了解该协议的必要信息以及要处理的数据。

    下图以用户a向用户b发送邮件为例子:

    TCP连接中的三次握手与四次挥手

    TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端间的准备工作。

    三次握手

    所谓三次握手是指建立一个TCP连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

    • 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。

    • 第二次握手:服务器端接收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都设置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

    • 第三次握手:客户端接收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,
      ACK是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器之间可以开始传输数据了。

    四次挥手

    四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务器端总共发送四个数据包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

    由于TCP连接是双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这以方向的连接,收到一个FIN知识意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

    • 中断连接可以是客户端,也可以是服务端

    • 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。意思是我(客户端)没有数据要发给你了,但如果你服务端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。

    • 第二次挥手:服务端接收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但我还没准备好,请你继续等待我的消息。这个时候客户端就进入FIN_WAIT_2状态,继续等待服务器端的FIN报文。

    • 第三次挥手:当服务端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端我这边的数据已经发完了,准备好关闭连接了。服务端进入LAST_ACK状态。

    • 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务端不知道要关闭,所以发送ack=N+1进入TIME_WAIT状态,如果server端没有收到ACK则可以重传。服务端接收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有得到回复,则证明服务端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

    实际上还可能会出现同时发起关闭的情况:

    通过序列号与确认应答提高可靠性

    • 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。

    • 在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。

    • 未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。

    • 此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。

    • 对于目标主机来说,反复收到相同的数据是不可取的。为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。为此我们引入了序列号。

    • 序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。

    重发超时的确定

    • 每次发包之前都会计算往返时间,以此确定超时间隔

    • 重发之后可能再次重发,超时间隔以指数形式增加 2 - 4 - 8

    • 重发多次之后将强制断开连接,不会无限重发

    参考


    欢迎到前端学习打卡群一起学习~516913974

  • 相关阅读:
    javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
    windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况
    javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
    ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
    HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码
    Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
    linq查询语句转mongodb
    winddows rabbitmq安装与配置
    Redis For Windows安装及密码
    出现,视图必须派生自 WebViewPage 或 WebViewPage错误解决方法
  • 原文地址:https://www.cnblogs.com/formercoding/p/12945040.html
Copyright © 2011-2022 走看看