美文网首页
【网络是怎样连接的】第2章 - 用电信号传输 TCP/IP 数据

【网络是怎样连接的】第2章 - 用电信号传输 TCP/IP 数据

作者: 邱杉的博客 | 来源:发表于2018-06-13 19:01 被阅读0次

(1)创建套接字
(2)连接服务器
(3)收发数据
(4)从服务器断开连接并删除套接字
(5)IP与以太网的包收发操作
(6)用UDP协议收发数据的操作

协议栈会与网卡进行配合,将数据切分成小块并封装成网络包,再将网络包转换成电信号或者光信号发送出去。

2.1 创建套接字

协议栈的内部结构

图2.1 TCP/IP软件采用分层结构.png

应用程序的下面是Socket库,其中包括解析器,解析器用来向DNS服务器发出查询。

协议栈的上半部分有两块,分别是负责用TCP协议收发数据的部分和负责用UDP协议收发数据的部分,它们会接受应用程序的委托执行收发数据的操作。

浏览器、邮件等一般应用程序收发数据时用TCP;
DNS查询等收发较短的控制数据时用UDP。

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

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

IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作。

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

调用socket时的操作

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

  • 首先是创建套接字的阶段。如图2.3①所示,应用程序调用socket申请创建套接字,协议栈根据应用程序的申请执行创建套接字的操作。
    在这个过程中,协议栈首先会分配用于存放一个套接字所需的内存空间。用于记录套接字控制信息的内存空间并不是一开始就存在的,因此我们先要开辟出这样一块空间来[插图],这相当于为控制信息准备一个容器。但光一个容器并没有什么用,还需要往里面存入控制信息。套接字刚刚创建时,数据收发操作还没有开始,因此需要在套接字的内存空间中写入表示这一初始状态的控制信息。到这里,创建套接字的操作就完成了。

  • 接下来,需要将表示这个套接字的描述符告知应用程序。描述符相当于用来区分协议栈中的多个套接字的号码牌。

  • 收到描述符之后,应用程序在向协议栈进行收发数据委托时就需要提供这个描述符。由于套接字中记录了通信双方的信息以及通信处于怎样的状态,所以只要通过描述符确定了相应的套接字,协议栈就能够获取所有的相关信息,这样一来,应用程序就不需要每次都告诉协议栈应该和谁进行通信了。

图2.2 显示套接字内容.png
netstat -ano

Mac 使用 netstat 无法查看进程id,通过端口找到对应进程的 pid
sudo lsof -i :9000
图2.3 消息收发操作.png

相关文章

网友评论

      本文标题:【网络是怎样连接的】第2章 - 用电信号传输 TCP/IP 数据

      本文链接:https://www.haomeiwen.com/subject/kxlseftx.html