网络编程(一):初识套接字
前言
这个系列会记录所有的学习计算机网络时的笔记。
首先计算机网络很重要(Web开发),网络在日常生活和学习中无处不在,但是你真的了解底层的那些细节吗?比如TCP/IP协议、UDP协议,在面试的时候可能会问到相关的细节。
参考书籍
本次参考的书籍是:
计算机网络:自顶向下
在此基础上,可以选择一些视频资料进行辅助,推荐一门好评较高的课程:中科大——计算机网络,同时,如果觉得学了这些知识而缺少lab来动手的话,可以参考这门lab,如果觉得过于简单,也可以挑战一下CS144.
Socket
Socket的中文翻译是套接字,这个翻译很难理解,你可以把它认为是一个接口,插座之类的物品,或者认为它是一个介质。在日常生活中,很多都是Client-Server的模式,即客户端请求服务器上的一些资源,服务器在收到客户端的请求之后把数据发送到给客户端,这些数据就是通过套接字来实现的传输的。
套接字(Socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将 I/O 插入到网络中,并与网络中的其他应用程序进行通信。
网络套接字是 IP 地址与端口 Port 的组合。
为了满足不同的通信程序对通信质量和性能的要求,网络系统提供了三种不同类型的套接字,以供用户在设计网络应用程序时根据不同的要求来选择。分别是:
流式套接字(SOCK-STREAM)。提供一种可靠的、面向连接的双向数据传输服务,**实现了数据无差错、无重复的发送。**流式套接字内设流量控制,被传输的数据看作是无记录边界的字节流。在 TCP/IP 协议簇中,使用 TCP 协议来实现字节流的传输,当用户想要发送大批量的数据或者对数据传输有较高的要求时,可以使用流式套接字。
数据报套接字(SOCK-DGRAM)。提供一种无连接、不可靠的双向数据传输服务。数据包以独立的形式被发送,并且保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端按发送顺序接收数据。在 TCP/IP 协议簇中,使用 UDP 协议来实现数据报套接字。在出现差错的可能性较小或允许部分传输出错的应用场合,可以使用数据报套接字进行数据传输,这样通信的效率较高。
原始套接字(SOCK-RAW)。该套接字允许对较低层协议(如 IP 或 ICMP )进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备。
这里需要记住两种协议:TCP和UDP,先不考虑它们底层是怎么实现的,TCP的特点就是可以保证在传送的过程中数据不丢失、不重复、不乱序,原原本本的把数据发送给接受者;而UDP协议考虑的很少,所以UDP协议可以用于传输速度快的场景。
创建Socket
这里为了简单起见,使用Python来创建
1
2
3
4
5
6
7
8
# 导入socket包
from socket import *
# 创建一个TCP套接字
serverSocket = socket(AF_INET, SOCK_STREAM) # TCP是流式套接字
# 绑定Server的IP和Port
serverSocket.bind(("127.0.0.1", 8080)) # bind的参数是tuple类型,需要一个地址和端口
到这里,已经成功把serverSocket绑定到IP地址为127.0.0.1:8080的机器上了
监听listen
在创建好serverSocket后,因为不知道什么时候server会收到连接请求,一个有效的方法是listen函数
1
serverSocket.listen(1)
这里,函数的参数是监听队列的大小,当有多个连接请求时,这些请求会被放到监听队列里面。
到目前为止,我们可以看一看serverSocket的一些信息
1
print(ServerSocket)
下面是输出信息
1
其中,第一个参数fd你可能不太了解,这个是一个文件描述符(file descriptor),文件描述符是一个Obj的handle,或者你也可以理解为指向文件的指针,在Unix和类Unix系统中,所有的I/O都被抽象为文件描述符,包括网络套接字。
流程
在创建一个socket时,可以遵循以下步骤
根据协议初始化一个socket
给socket绑定IP
开启监听
关闭这个socket,防止内存泄漏
好,这就是创建socket的所有过程~~