zoukankan      html  css  js  c++  java
  • 二、用电信号传输 TCP/IP 数据(2)

    4、从服务器断开并删除套接字

    (1)数据发送完毕后断开连接

    数据收发完毕后会有一方发起断开过程,这里以服务器一方发起断开过程为例讲解。

    首先,服务器的应用程序调用Socket库的close ---->  服务器协议栈生成包含断开信息的TCP头部,具体就是将控制位中的FIN比特设为1 ---->  协议栈委托IP模块向客户端发送数据,同时服务器套接字中记录下断开操作的相关信息 ---- > 客户端收到服务器发来的FIN为1的TCP头部时,客户端协议栈将套接字标记为进入断开操作状态 ----> 客户端返回一个ACK号告知服务器已收到FIN为1的包 ----> 协议栈告知浏览器来自服务器的数据已经全部收到 ---- > 客户端浏览器调用close结束数据收发操作 ----> 客户端协议栈生成一个FIN比特为1的TCP包,委托IP模块发给服务器 ----> 服务器返回ACK号。通信全部结束。

    (2)删除套接字

    和server通信结束后,用来通信的套接字就没用了,但是为了防止误操作,需要等待一段时间才删除套接字。

    如果与上一节相反,客户端先发起断开则:

    1. 客户端发生FIN
    2. 服务器返回ACK号
    3. 服务器方式FIN
    4. 客户端返回ACK号

    如果第4步中ACK号丢失,服务器没有收到ACK号,可能重发一次FIN。如果此时客户端套接字已被删除,则套接字保存的控制信息也就消失了,套接字对应的port会被释放。这时,如果别的程序恰好在使用该port,而服务器重发的FIN到达,于是这个FIN就好错误的跑到新套接字里面,新套接字就开始执行断开操作。回到开始,不马上删除套接字就是为了防止这样的误操作。

    (3)数据收发操作小结

    至此,用TCP协议收发应用程序数据的操作就结束了。最后做一个整理。

    5、IP与以太网的包收发操作

    (1)认识包

    网络包=头部(目的地址等控制信息,如贴在快递上的表单)+数据部分(委托方要发生给对方的数据,如快递包内的物品)

    1. 路由器根据目标地址判断下一个路由器位置(路由器是按照IP规则传输包的设备)
    2. 集线器在子网中将网络包传输到下一个路由(集线器是按照以太网规则传输包的设备)

    因此,以上可理解为:

    1. IP协议根据目标地址判断下一个IP转发设备的位置
    2. 子网中的以太网协议将包传输到下一个转发设备

     

    发送方将要访问的server的IP地址写入IP头部。IP协议根据这一地址查找包的传输方向,从而找到下一个路由器位置。----- IP协议委托以太网协议将包传输过去,这时IP协议查找下一个路由器的以太网地址(MAC地址),并将这个地址写入MAC头部。这样,以太网协议就知道将包发到哪个路由器了。----- 包在传输过程中会经过集线器,集线器根据以太网头部中记录的目的地信息查出相应传输方向 ---- 包到达下一个路由器。路由器中有张IP协议的表,根据该表以及IP头部中目的地信息查出下一个路由器MAC地址并记录在MAC头部(原MAC头部在收到包时被舍弃) ----- ..... ---到达目的地

    其它:以太网其实可替换成其它网如无线局域网、ASDL、FTTH等,MAC头部也会换成适合的头部。

    (2)包收发操作概览

     包收发操作起点:TCP模块委托IP模块发送包的操作。即TCP模块在数据块前面加上tcp头部,然后传给ip模块并告知ip模块对方ip地址。

    ip模块收到委托后,在包前添加ip头部(含ip地址)和mac头部(含mac地址),这时包已封装好。

    包被交给网络硬件(网卡),这个包是由0、1字串组成的数字信息,网卡将这些数字信息转换为电信号或光信号,并通过网线或光纤发送出去,这些信号到达集线器、路由器等转发设备,最终到达接收方。

    注:ip的职责就是发送包接收包

    (3)生成包含接收方ip地址的ip头部和生成以太网用的mac头部

    ip头部主要由:接收方ip地址、发送包的网卡的ip地址、协议号(tcp模块为06,udp为17都是十六进制)

    当计算机由多块网卡时需要判断具体是哪块网卡,在命令行route print显示路由表。首先对套接字中记录的目的ip地址与网络目标的前24位匹配,接口即是网卡ip。

    IPv4 路由表
    ===========================================================================
    活动路由:
    网络目标        网络掩码          网关       接口   跃点数
              0.0.0.0          0.0.0.0            在链路上         1.1.3.102     21
            1.1.3.102  255.255.255.255            在链路上         1.1.3.102    276
            127.0.0.0        255.0.0.0            在链路上         127.0.0.1   4531
            127.0.0.1  255.255.255.255            在链路上         127.0.0.1   4531
      127.255.255.255  255.255.255.255            在链路上         127.0.0.1   4531
          169.254.0.0      255.255.0.0            在链路上    169.254.18.186   4491

    ip模块在生成ip头部后,就要加上mac头部(含接收方mac地址和发送方mac地址、以太类型)

    (4)通过ARP查询目标路由器的mac地址

    ARP:地址解析协议

    ARP通过广播将包发给以太网中的设备,如果ip对应则该设备返回自己的mac地址,然后将该mac地址写入mac头部,mac头部就完成了

    以太网是一种为多台计算机能彼此自由和廉价地相互通信而设计的通信技术,并且由三个性质:将包发送到mac头部的接收方mac地址代表的目的地,用发送方mac地址识别发送方,用以太类型识别包的内容。

    (5)将ip包转换成电或光信号发送出去

    网卡负责数字信息的网络包转换为电或光信号发送出去

    (6)给网络包再加3个控制数据

    向集线器发送网络包 ,接收返回包,将服务器的响应包从ip传给tcp

    6、udp协议的收发操作

    不需要重发的数据用udp发送更高效:

    udp没有建立连接和断开连接的步骤,只要在从应用程序获取的数据前面加上udp头部,然后交给ip发送即可。接收,根据ip头部中接收方和发送方ip地址,及udp头部的接收方和发送方端口号,找到相应套接字并将数据交给相应应用程序就可以了。

    向DNS服务器查询ip地址、发送视频和音频数据

    渐变 --> 突变
  • 相关阅读:
    Kaldi的data目录解析
    Kaldi的nnet3
    Kaldi中的Chain模型
    Karel版本的nnet1
    Dan版本的nnet2
    MFCC/Filter Bank的提取流程
    【算法专题】工欲善其事必先利其器—— C++ STL中vector(向量/不定长数组)的常用方法总结
    App 设计技巧
    js判断是否在微信浏览器中打开
    WebApi 跨域
  • 原文地址:https://www.cnblogs.com/lybpy/p/8159028.html
Copyright © 2011-2022 走看看