用电信号传输TCP/IP


上一章我们说了浏览器在网络传输中做了哪些工作:首先解析URL,然后根据URL的信息和语境完成消息,然后询问IP,然后向web服务器发送消息。
这其中的一些任务只是有浏览器参与,并不是由浏览器完成的。如询问IP和向web服务器发送消息,因为浏览器是应用程序,他本身并不具有网络功能,那么他又是通过什么方法获得数据的呢?

发送消息

现在浏览器已经将想要发送的消息准备好了,如何发送给web服务器的呢?

创建套接字

理解套接字

套接字就像是客户机连接外界的一个洞。
你在想要利用操作系统的网络功能前,你需要先告诉操作系统,“我想利用网络!“,然后操作系统会凿开一个洞。这个洞就是套接字。
同时操作系统需要给这些洞做一些纪录(如果不纪录的化,操作系统到处都是洞他自己又不知道在哪,那岂不是很危险),这些记录就是控制信息。协议栈在执行操作时需要参阅这些信息来决定下一步操作,这写信息存在于协议栈的一块内存中。
查看套接字,windows在cmd中输入

netstat -ano

在这里插入图片描述
本地0.0.0.0表示通信未开始,不绑定IP

创建套接字

使用Socket库中的socket程序组件来创建套接字。

<描述符>  =  socket(<使用IPv4>,<使用TCP>)

执行完毕后,操作系统就会“哐叽”给你凿开一个通往外界的洞。然后他就要开辟出一块内存来纪录一下这是第几个洞(初始化描述符,描述符是标识),这就是控制信息。此时的状态是上张图片的前几行,操作系统知道这个洞的采用的传输协议,操作系统处于监听状态,请求网络的进程ID,但是没有分配IP。(因为创建套接字的时候没有提供IP信息,操作系统不知道这个洞是通往哪的啊!!就只是凿了一个洞,知道这个洞的序号,是谁让我凿的洞,操作系统得一直看着这个洞以免出现安全性问题)

连接服务器

什么是连接

连接实际上是通信双方交换控制信息
因为通信是双方的,光你凿开了一个洞不行啊,你的看看服务器是不是也有一个洞可以连接,还要确定一下人家让不让你连接。所以你要给服务器发送一个小消息,里面包含着“写信人(IP地址端口号)、收信人(IP地址)、内容(你同不同意我连接啊)”。他们传递的也属于控制信息。
至此我们说完了所有的控制信息,也就是所有包含通讯地址的信息。
操作系统的协议栈中有控制信息,因为操作系统需要知道我的每一个开放“港口”要通往哪些国家,处于什么状态;在双方的通信中有控制信息,因为往来信件需要有发件人收件人。
连接具体要完成的工作:

  1. 把服务器的IP地址和端口号告知协议栈(因为至此操作系统还是不知道那个洞是要通向哪里,所以它没办法发信息)
  2. 客户端向服务器传达开始通信的请求(发信息)
  3. 分配收发数据的缓冲区(为接受数据做准备)

连接操作的实际过程

连接是从应用程序调用Socket库的connect程序组件开始的。

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

上面的调用提供了服务器的IP地址和端口号(端口号是根据你要完成的功能固定的,如果你要完成浏览网页是80端口,加密浏览网页是443端口等等),这些信息会传递给协议栈中的TCP模块。(task1 get!)TCP模块会与该IP地址对应的对象,也就是服务器的TCP模块交换信息,这一交互过程包括以下几个步骤:

  1. 首先,客户端先创建一个包含表示开始数据收发操作的控制信息头部(写好信)
  2. 接下来,TCP模块会将信息传递给IP模块并委托其进行发送(具体的发送过程以后还会再说)
  3. 服务器上的IP模块会将接收到的数据传递给TCP模块
  4. 服务器的TCP模块从处于等待连接的套接字中找到TCP头部中记录的端口号,则根据端口号找到了合适的洞。
  5. 当找到了对应的套接字后,套接字中会写入相应的信息,并将状态改为正在连接。(终于不是等待了!!!)
  6. 服务器的TCP模块开始写信,这个过程和客户端的写信模式相同。内容有可能不同,因为服务器除了之前收发件人、同意链接等信息,还需要填一句您的来信我收到了。
  7. 服务器TCP模块会将TCP头部(信)传递给IP模块,并委托IP模块向客户端返回响应。
  8. 网络包返回客户端,通过IP模块到达客户机TCP模块,并通过TCP头部的信息来确认连接操作是否成功,如果成功,这时会向套接字中写入服务器的IP地址,端口号等信息,同时还会修改状态为连接完毕(上一张图片上的established状态)
  9. 然后客户端也发一个确认收到信件的信息
  10. 连接操作完成。

收发数据

如果说创建套接字是在客户机上凿开一个洞,那么连接过程就是在客户机和服务器的对应洞之间插上一条管子。然后客户机往洞里放数据,数据顺着管子就能到达服务器。

其他知识

套接字、Socket、协议栈的区别和联系

猜你喜欢

转载自blog.csdn.net/tinpo_123/article/details/83448619