网络编程(一):初识套接字

前言

这个系列会记录所有的学习计算机网络时的笔记。

首先计算机网络很重要(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 )进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备。

这里需要记住两种协议:TCPUDP,先不考虑它们底层是怎么实现的,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
<socket.socket fd=340, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080)>

其中,第一个参数fd你可能不太了解,这个是一个文件描述符(file descriptor),文件描述符是一个Obj的handle,或者你也可以理解为指向文件的指针,在Unix和类Unix系统中,所有的I/O都被抽象为文件描述符,包括网络套接字。

流程

在创建一个socket时,可以遵循以下步骤

  • 根据协议初始化一个socket
  • socket绑定IP
  • 开启监听
  • 关闭这个socket,防止内存泄漏

好,这就是创建socket的所有过程~~

Licensed under CC BY-NC-SA 4.0
花有重开日,人无再少年
使用 Hugo 构建
主题 StackJimmy 设计