zoukankan      html  css  js  c++  java
  • 终端上包的生成及发送出电脑的过程

    本章是‘网络是怎么连接的--读后感’第二章

    前言

      本章是系列博客的第二章;第一章讲数据发送的场景;第二章主要讲叙消息是如何发送出去的.

    实现需求

    消息发送出去需要四部

    1. 创建套接字;
    2. 连接服务器建立管道;

    3. 接收数据;
    4. 与服务器断开连接并删除套接字;
    5. IP与以太网在包收发过程中的作用;
    6. 数据包转换成电/光信号发送;
    7. 补充:UDP协议如何进行包的收发操作。

    正文

      第一章介绍了数据传输的的场景;本章讲结合第五章具体阐述在用户端电脑及服务器上数据是如何收发的。在浏览器上http协议通过解析用户输入网址获得http的消息,实际数据在网络上传播并非以消息传播的,而是通过数据包传播;消息转变为数据包的过程是通过协议栈来实现的,先看个终端协议栈模型图,该图具有层级结构,上级向下一级指派工作,数据在终端上处理大概就是通过这个层级来实现:

    补充下:操作系统协议栈内的协议众多并非只有tcp和udp协议;不同的业务场景使用协议可能不同;大部分web通信都是使用的tcp协议,tcp最典型功能是包传输具有确认机制不丢包;udp主要使用于传输的数据较短无需对包进行分隔时。

    数据就是通过上图环节在电脑上进行处理的;主要有四步:

    一、创建套接字

        套接字是对存了数据传输的一些控制信息,IP地址,端口的内存和数据的泛称;可以抽象成一张存了数据传输起点,终点位置信息,及数据传输控制操作信息的表;协议栈就是根据套接字的信息来控制数据传输的;一般会存本机网卡IP和端口,目的地的IP和端口,通信的状态信息,创建套接字的进程pid。套接字在消息收发过程中操作如下:

    套接字在消息收发过程中的作用如图:

    1. 应用程序通过调用Socket库的socket方法创建套接字,计算出的套接字通过一个变量描叙符存入内存中;
    2. 然后通过调用Socket库的connect方法建立和服务器套接字的连接;
    3. 调用write方法将http消息传给协议栈(tcp);
    4. 在服务器传数据过来时tcp协议栈通过套接字的控制信息调用操作系统的read方法将响应数据传给应用程序的缓存区;
    5. 在客户端/服务端均可通过套接字控制信息调用操作系统close方法,断开连接;

        

    二和三、与服务器连接,建立数据传输通道,并传输数据

        连接实际上是通信双发交换控制信息,除了套接字的控制信息,协议包头部本身也存在控制连接的控制信息;因此双方要交换控制信息,双方就必须都具有套接字;客户端套接字创建上方已经讲了,服务器的套接字在服务器初始化时就创建好了,一直处于等待连接阶段,因此只需要协议栈的tcp协议向服务端发起请求交换这两部分的控制信息即可;实际过程如下:

    • 应用程序调用Socket库的connect方法;这个方法里面含有‘应用程序套接字的描叙符,服务器的IP和端口’等参数;通过这个方法将这些控制信息传给协议栈;
    • http生成的消息会存放在发送缓冲区;tcp协议对数据长度有约束,会将数据分割成合法的小段;并在数据段前加上tcp头部;
    • 协议栈根据获得的控制信息;将控制信息写入tcp包的头部,含有接收方的IP,接受方端口(通过请求地址和默认端口可以知道,套接字和端口是关联的,能定位服务器连接的套接字)
    • 然后协议栈再将tcp包给IP模块委托IP将包发送出去;IP在包前面加上IP头(里面含发送方的IP地址)和mac头,mac头是根据目的地IP通过arp计算出来的,。。。。
    • 服务器接收到包;根据包的控制信息判断出是发给它的包,通过解析tcp包头部的控制信息找到需要建立连接的套接字;
    • 并将收到的包的tcp头部中的控制信息提取出来,同步到他的套接字中;由于客户端发送过来的第一段tcp包的syn(tcp头部字段,建立连接时为了使得两端进行确认的字段)为1;因此知道是来建立连接的包,服务端进行响应,响应有应答机制ack(tcp头部参数),用来确认收到了包;
    • 服务端以相同的操作发送连接的控制的包;客户端收到包后;根据解析的头信息确认到syn为1;知道是服务端发送过来交换控制的包;后将收到的包的控制信息同步到应用程序套接字中,并进行应答确认收到了包,至此就建立了信息传输的通道;
    • 第二部在发送缓冲区,tcp将http消息切割成了小的数据包;在接收方同时会有接受缓冲区,由于tcp头部含有每个包的序号,因此根据序号就能在接收缓冲区最后将包组装还原成原来的数据;
    • tcp最强大的功能,就是数据传输过程中能保证不丢包,这是通过tcp包的序号和应答的包的ack来确定的;简单说就是tcp发送的包会在头部带有序列号,接收方接收后会根据序列号计算出ack,然后在响应时会将ack发送给发送方,发送方就能根据收到响应的ack来确定包有没有正常接收,如果ack没有或者有误,就重新发送包;
    • 补充:ack是tcp协议的一种确认机制;实际使用时常和窗口更新一起传输;窗口更新是指,在接收方会有一个接收缓冲区,当接受的数据没被应用程序使用前会存在这里,窗口大小就是接受缓冲区剩余容量的大小;将多个ack的响应和窗口更新消息一起发送给发送方,可以减小网络中传输的包的数量减少带宽,同时接收方接受到窗口信息,就能有效控制数据包的发送;
    • 建立连接传输数据包并不是终点;接收方接受的数据包是存放在接收缓冲区,事实是在发起数据请求时应用程序就调用了Socket库的read方法创建了一个事务将接受缓冲区的数据传给应用程序,由于数据响应需要时间这个事务是暂时先挂起的,一旦响应的数据传到缓冲区就激活了这个事务将数据传给应用程序;
    • 补充:http生成的消息是应用程序通过Socket库的write方法传到发送缓冲区的;

    四、断开与服务器的连接,并删除套接字

      应用程序判断数据传输完了就会执行断开操作;原则上客户端和服务端都可以先断开,在http1.0中是服务端先断开,http1.1是客户端先断开(有个原则是数据的发送方一定先断开),具体过程如下:

    1. 数据发送发确认数据发送完了后,就调用Socket库的close程序;
    2. 接下来发送方的协议栈就会生成含断开控制信息的tcp的数据包(tcp头部fin:1);并将控制信息同步到套接字中;
    3. 和第二步相同的方式将含断开控制信息的数据包发送出去;接收方接收到数据包后,做出确认应答(响应含ack的包);
    4. 同时接收方将接收到的控制信息同步到套接字;根据套接字控制信息也会调用close程序;以相同的方式发出含断开控制信息的包;
    5. 发送方接收到包后会将其控制信息同步到自己的套接字同时确认应答(响应含ack的包);
    6. 等待一段时间删除套接字;

    五、IP与以太网在包收发过程中的作用。

      第二部讲了IP模块会在tcp包的头部加上,mac头部和IP头部;IP头部是为了包在转发设备中转发确定目的地,转发设备常见的有集线器,交换机(交换式集线器),路由器;通过IP模块构建包的IP头实际是查本机的路由表,确定包的发送端的IP接收端的IP网关IP(网关可以抽象成接口看待,这里的网关是指最近可进行转发路由器的IP)注意IP一般是运营商赋予的可变的一般存在网卡内存中;mac头部由三部分构成,‘接收方mac,发送方mac,以太类型(包使用的协议类型);由于发送方mac是网卡驱动程序从网卡rom中复制出来的,因此是固定的,接收方mac可以根据arp协议来获得’

      arp协议是通过广播的形式将包通过以太网传输到局域网的所有终端;来获取所有终端的mac信息,由于包本身是带有最近的转发设备的IP信息(网关),因此就能确定需要的是哪个设备的mac;在根据以太网协议根据包的mac头部将包传给了最近的转发设备;(注意IP协议只确定包的目的地和下一个转发路由的地址;实际转发是通过以太网协议也就是mac实现的)。

    六、数据包转换成电/光信息发送

      我们知道,信号传输需要借助,网线,电缆,或光纤;说明IP包是数字信号是无法直接传输的,需要先转换成电/光信号才能传播;这需要借助网卡实现,网卡结构如下:

    由图可知IP模块将数据包传给网卡后,网卡将数据包存放在网卡的缓存区,后面操作如下:

    1. 通过网卡的mac模块对IP数据包进行处理;在数据包前面加上报头和起始桢分界符,在包最后加上fcs错误效验;
    2. 报头是一段1010比特序列用来确认包的读取时机;起始桢分界符是用来确定数据包的起始位置;fcs错误效验通过发送方计算出的fcs和接收方计算出的fcs比较来确认包在传输过程种头是否有变化;
    3. 数据信号即01的比特信号,在电路中传输通过高低电压来表示;为了能完整表示包的信息通过引入高低起伏的时钟信号来一起构建,mac模块结合时钟信号将数据包转换为电信号;
    4. mac模块将数据转换成通用的电信号,在通过PHY(MAU)将信号转换成在特定介质中传输的格式,在通过信号收发模块将信号发送出去;
    5. 补充;由于电信号在介质中传输是极快的,因此我们常说的带宽,传输速率一般是指在PHY模块上转换的速率。
    6. 接收到的电信号转为数据包的过程就正好相反,在网卡接收到电信号通过PHY转换成通用电信号给mac模块;mac模块将电信号转换成数字信号,mac模块先检查fcs确认数据无误后;在查看报头,如确认数据包是发给自己的就将数据包在转发给协议栈。
    7. IP模块收到网卡发过来的包会先检查接收方IP确认包是否是发给他的,如果不是就通过icmp消息报错;如果是的就将包传给tcp协议;tcp协议在根据包的头部信息找到接收方的端口;根据端口找到关联的套接字,读出包头部的控制信息并将信息同步到套接字,根据套接字的控制信息执行下一步操作,将数据传给应用程序的接收缓存区。

    七、UDP协议如何进行包的收发操作

      UDP和TCP很类似都是用来传输数据包的;突出的特点是没有TCP的应答机制,发送数据包时;接收端接收到包后不会应答不会通知发送方它收到了这个包,因此他不适合传输较长需要通过多个包传输的数据;不过因为没有应答机制,他的反应更快;一般用作dns查询域名解析时,音视频由于对数据传输速度有要求也常用udp协议。

  • 相关阅读:
    爬取动态html网页,requests+execjs
    pycharm2019.2一个奇怪的bugger,执行后输出内容被莫名处理
    博客园啥时候升级了,刚看到
    在浏览器的市场上,IE依然是放弃了,firefox还在继续~~
    jetbrain rider 逐渐完美了,微软要哭了么?
    div层的滑入滑出实例
    关于js的<、>、=、<=、>=的比较
    Jquery实现左右轮播效果
    Html5离线缓存详细讲解
    CANVAS画布与SVG的区别
  • 原文地址:https://www.cnblogs.com/1009gavin/p/9251906.html
Copyright © 2011-2022 走看看