(该图由AI制作 学习AI绘图 联系我)
目录
数据收发操作概览
创建套接字阶段
连接阶段:把管道接上去
通信阶段:传递消息
断开阶段:收发数据结束
数据收发操作概览
知道了
IP
地址之后
,
就可以委托操作系统内部的协议栈向这个目标 IP地址发送消息
要发送给
Web
服务器的
HTTP
消息是一种数字信息
(
digital data
)
收发数字信息这一操作不仅限于浏览器,对于各种使用网络的应用程序来说都是共通的。
和向
DNS
服务器查询
IP
地址的操作一样
,
这里也需要使用
Socket
库中的程序组件
。
不过
,
查询
IP
地址只需要调用一个程序组件就可以了
,
而这
里需要按照指定的顺序调用多个程序组件
建立管道的关键在于管道两端的数据出入口
,
这些出入口称为
套接字
。
- 服务器一方先创建套接字,然后等待客户端向该套接字连接管道
- 客户端也会先创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上
- 当双方的套接字连接起来之后,通信准备就完成了
-
将数据送入套接字就可以收发数据了
-
当数据全部发送完毕之后 , 连接的管道将会被断开, 管道断开后 , 套接字也会被删除 。
都是由操作系统中的协议栈来执行的
创建套接字阶段
应用程序
(
浏览器
)
委托收发数据的过程
。
首先是套接字创建阶段
调用 Socket 库中的 socket 程序组件 (图 ①)。
调用
socket
之后
,
控制流程会转移到
socket
内部并执行创建套接字的操作
套接字创建完成后
,
协议栈会返回一个描述符
,
应用程序会将收到的描述符存放在内存中
出示描述符
,协议栈就能够判断出我们希望用哪一个套接字来连接或者收发数据了
应用程序是通过“描述符”这一类似号码牌的东西来识别套接字的。描述符:应用程序用来识别套接字的机制IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制
连接阶段:把管道接上去
需要委托协议栈将客户端创建的套接字与服务器那边的套接字连接起来
应用程序通过调用
Socket
库中的名为
connect 的程序组件来完成这一操作
(
图
②
)。
当调用
connect
时
,
协议栈就会执行连接操作
。
当连接成功后
,
协议栈会将对方的
IP
地址和端口号等信息保存在
套接字中
,
这样我们就可以开始收发数据了
通信阶段:传递消息
通过
Socket 库委托协议栈来完成:
将数据送入套接
字
应用程序需要在内存中准备好要发送的数据:
根据用户输入的
网址生成的
HTTP
请求消息就是我们要发送的数据
调用
write时
,
需要指定描述符和发送数据
(
图
③
)
当消息返回后
,需要执行的是接收消息的操作:Socket
库中的
read
程序组件委托协议栈来完成的
(
图
③’)
需要指定用于存放接收到的响应消息的内存地址
,
这一内存地址称
为接收缓冲区
。
断开阶段:收发数据结束
要调用 Socket 库的 close 程序组件进入断开阶段(图 ④)
套接字之间的管道会被断开
,
套接字本身也会被删除