《网络是怎讲连接的》学习笔记 第二章

本文详细介绍了网络数据传输的过程,从创建套接字、连接服务器到收发数据。套接字是通信控制信息的载体,连接操作涉及客户端与服务器的控制信息交换,确保数据正确传输。TCP/IP协议栈在其中起到关键作用,通过设置头部信息进行连接建立、数据拆分及ACK确认,确保网络包的完整接收。
摘要由CSDN通过智能技术生成

《网络是怎样连接的》笔记第二章

第二章 用电信号传输TCP/IP数据

2.1 创建套接字

协议栈的内部结构

本节目的
探索操作系统中的网络控制软件(协议栈)和网络硬件(网卡)是如何将浏览器的消息发送给服务器的。

TCP/IP分层结构
image-20220314164248750

  • 上图有些上下具有委派关系,上层委派下层工作,下层实际执行

  • 上图操作系统层上半部是 TCP和UDP,暂时只需知道:

    浏览器、邮件等一般应用程序收发数据时用TCP

    DNS查询等收发较短的控制数据时用UDP

  • 上图操作系统层下半部是:

    • 用IP协议控制网络包收发操作的部分,在互联网上传送数据时,数据会被切分成一个一个的网络包,而将网络包发送给通信对象的操作就是由IP来负责的。
    • IP中还包括ICMP协议和ARP协议。
      ICMP用于告知网络包传送过程中产生的错误以及各种控制消息
      ARP用于根据IP地址查询相应的以太网MAC地址
  • IP下面的网卡驱动程序负责控制网卡硬件

  • 最下面的网卡则负责完成实际的收发操作,也就是网线中的信号执行发送和接收的操作

套接字的实体就是通信控制信息

本节目的:
上节已经了解了协议栈的内部结构,这节来具体看看数据收发中扮演关键角色的套接字。

套接字实体的概念

  • 在协议栈内部有一块用于存放控制信息的内存空间,这里记录了用于控制通信操作的控制信息,控制信息例如有通信对象的IP地址、端口号、通信操作的进行状态等
  • 本来套接字就只是一个概念而已,并不存在实体,如果一定要赋予它一个实体,我们可以说这些控制信息就是套接字的实体,或者说存放控制信息的内存空间就是套接字的实体

套接字实体的作用

  • 协议栈在执行操作时需要参阅控制信息(套接字实体)。

  • 例如

    • 在发送数据时, 需要看一看套接字中的通信对象IP地址和端口号,以便向指定的IP地址和端口发送数据
    • 在发送数据之后,协议栈需要等待对方返回收到数据的响应信息,但数据也可能在中途丢失,永远也等不到对方的响应。在这样的情况下,我们不能一直等下去,需要在等待一定时间之后重新发送丢失的数据,这就需要协议栈能够知道执行发送数据操作后过了多长时间。
      为此,套接字中必须要记录是否已经收到响应,以及发送数据后经过了多长时间,才能根据这些信息按照需要执行重发操作
  • 上面说的只是其中一个例子,套接字中记录了用于控制通信操作的各种控制信息协议栈则需要根据这些信息判断下一步的行动,这就是套接字的作用

综上:协议栈是根据套接字中记录的控制信息来工作的。

windows查看套接字

在cmd中输入netstat可显示套接字内容(如下图)。

image-20220314165643883
  • 图中每一行相当于一个套接字,当创建套接字时,就会在这里增加一行新的控制信息,赋予“即将开始通信”的状态,并进行通信的准备工作如分配用于临时存放收发数据的缓冲区空间

  • 图中第8行解析:它表示PID为4的程序正在使用IP地址为10.10.1.16的网卡与IP地址为 10.10.1.80的对象进行通信。此外我们还可以看出,本机使用1031端口、 对方使用139端口,而139端口是Windows文件服务器使用的端口,因此 我们就能够看出这个套接字是连接到一台文件服务器

  • **图中第1行解析:**我们再来看第1行.这一行表示PID为984的程序正在135端口等待另一方的连接。其中本地IP地址和远程IP地址都是0.0.0.0,这表示通信还没开始,IP地址不确定。

调用socket时的操作

本节目的:
查看浏览器调用socket,connect等Socket库中的程序组件时,协议栈内部是如何工作的。

旧图重用:

image-20220314165916758

创建套接字

  • 在①准备时会创建套接字

  • 应用程序调用socket申请创建套接字,协议栈根据应用程序的申请执行创建套接字的操作

  • 在这个过程中,协议栈首先会分配用于存放一个套接字所需的内存空间。套接字控制信息的内存空间并不是一开始就存在的,因此我 们先要开辟出这样一块空间来’,这相当于为控制信息准备一个容器.

  • 一个容器并没有什么用,还需要往里面存入控制信息,套接字的实体是通信控制信息。套接字刚刚创建时, 数据收发操作还没有开始,因此需要在套接字的内存空间中写入表示这一 初始状态(数据收发还没开始的初始状态)的控制信息,到这里,创建套接字的操作就完成了。

综上: 创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态

2.2连接服务器

​ 创建套接字之后,应用程序(浏览器)就会调用connect,随后协议栈会将本地的套接字与服务器的套接字进行连接。

连接是什么意思
  • 以太网的网线都是一直连接的状态,我们并不需要来回叫插拔网线,物理上一直处于连接,所以在这里的连接应该有其他意思。

  • 连接实际上是通信双方交换控制信息(不是客户端单向的向服务端),在套接字中记录这些必要信息并准备数据收发的一连串操作。

  • **控制信息:**就是用来控制数据收发操作所需的一些信息,IP地址和端口号就是典型的例子

  • 缓冲区:当执行数据收发操作时,我们还需要一块用来临时存放要收发的数据的内存空间,这块内存空间称为缓冲区,它也是在连接操作的过程中分配的。

连接细节与目的(高亮处)

  • 套接字刚刚创建完成的时候,里面并没有存放任何数据、也不知道通信的对象是谁一,在这个状态下,即便应用程序要求发送数据,协议栈也不知道数据应该发送给谁

  • 浏览器可以通过网址解析和DNS服务器来查询Web服务器的IP,根据规则会使用80号端口。

  • **连接目的一:**浏览器知道IP和端口号没有用,协议栈才具备发送功能,因此需要将IP和端口号给协议栈

  • 服务器一般会在系统启动初创建套接字然后等待客户端套接字的连接,与客户端相同服务端协议栈也不知道IP和端口号,不同的是服务端的应用程序也不知道通信对象是谁。

  • 连接目的二:客户端向服务器传达开始通信的请求。在服务器无法主动发送的情况下,让客户端向服务器告知必要的信息,比如“我想和你开始通信,我的IP地址是XXX.XXX. xxx.xxx,端口号是yyyy.

负责保存控制信息的头部

我们所说的控制信息其实可以大体分为两类:

  • 客户端和服务器相互联络时交换的控制信息
  • 保存在套接字中,用于控制协议栈操作的信息(这些信息保存在协议栈的套接字内存空间中)
客户端和服务器联络时的交换控制信息
  • 这些信息不仅 连接时需要,包括数据收发和断开连接操作在内,整个通信过程中都需要

  • 下图中的这些字段就是TCP规格中定义的控制信息,这些字段是固定的,在连接、收发、 断开等各个阶段中,每次客户端和服务器之间进行通信时,都需要提供这些控制信息

    image-20220314172036797

  •   具体来说,如**下图**(a)所示,**上图信息**会被添加在客户端与服务器之间传递的网络包的开头 在连接阶段。
      		 由于数据收发还没有开始. 所以如图2.4(b)所示,网络包中没有实际的数据,只有控制信息,这些控制信息位于网络包的开头,因此被称为头部(TCP头部)。
      		 此外,以太网和IP协议也有自己的控制信息,这些信息也叫头部,为了避免各种不同的头部发生混淆, 我们一般会记作TCP头部,以太网头部,IP头部.
    

    image-20220314170635424

套接字中,用于控制协议栈操作的信息
  • 应用程序传递来的信息以及从通信对象接收到的信息都会保存在套接字中,还有收发数据操作的执行状态等信息也会保存在套接字中,协议栈会根据这些信息来执行每一步的操作 我们可以说,套接字的控制信息和协议栈的程序本身其实是一体的

  • “协议栈具体需要哪些信息”会根据协议栈本身的实现方式(操作系统)不同而不同,但这并没有什么问题因为协议栈中的控制信息通信对方是看不见的,只要在通信时按照规则将必要的信息写入头部,客户端和服务器之间的通信就能够得以成立

    • 例如:Windows和 Linux操作系统的内部结构不同,协议栈的实现方式不同,必要的控制信息也就不同一但即便如此,两种系统之间依然能够互相通信
    • 同样地,计 算机和手机之间也能够互相通信。
  • 我们无法具体说明协议栈里到底保存了哪些控制信息,但可以用命令来 显示一些重要的套接字控制信息(下图),这些信息无论何种操作系统的协议栈都是共通的

    image-20220314171247468

连接操作的实际过程
  • 这 个过程是从应用程序调用Socket库的connect开始的(下图②)。

    image-20220314173419456

connect (<描述符 >, < 服务器IP地址和端口号>,…)

注意:

1.Socket库在应用程序,协议栈在操作系统,socket组件在Socket库,套接字实体在协议栈。

2.应用程序调用socket申请创建套接字,协议栈根据应用程序的申请执行创建套接字的操作

  • connect的调用提供了服务器的IP地址和端口号,这些信息会传递给协议栈中的TCP模块,然后,TCP模块会与该IP地址对应的对象,也就是与服务器的TCP模块交换控制信息。

    这一交互过程包括几个步骤:

    • 客户端先创建一个包含表示开始数据收发操作的控制信息的头部。如下图,这里重点是发送方和接收方的端口号。此时客户端知道了应该连接那个套接字(服务器的套接字)。

      image-20220314173748616

    • 我们将头部中的控制位的SYN比特设置为1 ,大家可以认为它表示连接此外还需要设置适当的序号和窗口大小,TCP头部创建完毕

    • 当TCP头部创建好之后,接下来TCP模块会将信息传递给IP模块(下图)并委托它进行发送。IP模块执行网络包发送操作后,网络包就会通过网络到达服务器,然后服务器上的IP模块会将接收到的数据传递给TCP模块。

    • 服务器的TCP模块根据TCP头部中的信息(之前说过头部最重要的端口号信息)找到端口号对应的套接字,也就是说,从处于等待连接状态的套接字(服务器的套接字)中找到与TCP头部中记录的端口号相同的套接字就可以。当找到对应的客户端套接字之后,服务端套接字中会写入相应的信息,并将状态改为正在连接。

    • 服务器的TCP模块会返回响应,这个过程和客户端一样,需要在TCP头部中设置发送方和接收 方端口号以及SYN比特为1,此外,在返回响应时还需要将ACK控制位设为 1,这表示已经接收到相应的网络包。网络中经常会发生错误,网络包也会发生丢失,因此双方在通信时必须相互确认网络包是否已经送达,而设置 ACK比特就是用来进行这一确认。

    • 服务器TCP模块会将TCP 头部传递给IP模块,并委托IP模块向客户端返回响应

    • 网络包就会返回到客户端,通过IP模块到达TCP模块,并通过TCP头部的信息确认连接服务器的操作是否成功。如果SYN为1则表示连接成功,这时会向套接字中写入服务器的IP地址、端口号等信息,同时还会将状态改为连接完毕。

    • 客户端也需要将ACK比特设置为1并发回服务器,告诉服务器刚才的响应包已经收到当这个服务器收到这个返回包之后,连接操作才算全部完成

  • 建立连接之后,协议栈的连接操作就结束了,也就是说connect已经 执行完毕,控制流程被交回到应用程序

总结:

  • 连接操作的第一步是在TCP模块处创建表示连接控制信息的头部。

  • 通过TCP头部中的发送方和接收方端口号可以找到要连接的套接字。

2.3收发数据

将http请求消息交给协议栈

数据收发操作是从应用程序调用write将要发送的数据交给协议栈此时还没发送给服务器!
image-20220314174604978

流程:

  • 应用程序在调用write时会指定发送数据长度,对于协议栈来说要发送的只是一串二进制字节序列。
  • 协议栈收到数据会将其存到缓冲区,等数据到一定量再发送(有点应用程序可能会分很多次将数据交给协议栈如果直接发送会有很多小包,降低效率)
    • 一定量的决定因素之一:网络包能容纳的数据长度
      MTU:一个网络包的最大长度,以太网中一般为1500字节。
      MSS:除去头部之后,一个网络包所能容纳的TCP数据的最大长度。
      当长度大于或接近MSS再发送就可以避免大量小包的问题
    • 一定量的决定因素另一:若应用程序发送给协议栈的频率过满,就会需要等很久,因此需要一个计时器,超时就发送。
  • 上面是协议栈来控制发送时机,实际上应用程序也可以控制发送时机,例如:应用程序在发送数据时,可以直接指定不填满缓冲区直接发送从而降低延迟
对较大的数据进行拆分
  • HTTP请求信息一般不会太长,一个网络包的长度够(MSS),但是提交表单例如发表论文就会超过MSS。

  • 此时以MSS为单位进行拆分,拆分的每块数据放进单独的网络包

  • 在每一块前面加上TCP头部,然后交给IP模块执行发送数据的操作

    image-20220314180343709

使用ACK确定网络包已收到
  • TCP在拆分数据时,会算好TCP头部的数量与并发送—>发送头部长度和总长度
    因此接收方可计算得出数据长度
  • 通过序号进行验证接受到的网络包有没有遗漏
    105
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值