前言
这个系列会记录所有的学习计算机网络时的笔记。
首先计算机网络很重要(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
来创建
|
|
到这里,已经成功把serverSocket
绑定到IP
地址为127.0.0.1:8080
的机器上了
监听listen
在创建好serverSocket
后,因为不知道什么时候server
会收到连接请求,一个有效的方法是listen
函数
|
|
这里,函数的参数是监听队列的大小,当有多个连接请求时,这些请求会被放到监听队列里面。
到目前为止,我们可以看一看serverSocket
的一些信息
|
|
下面是输出信息
|
|
其中,第一个参数fd
你可能不太了解,这个是一个文件描述符(file descriptor)
,文件描述符是一个Obj
的handle,或者你也可以理解为指向文件的指针,在Unix和类Unix系统中,所有的I/O都被抽象为文件描述符,包括网络套接字。
流程
在创建一个socket
时,可以遵循以下步骤
- 根据协议初始化一个
socket
- 给
socket
绑定IP - 开启监听
- 关闭这个
socket
,防止内存泄漏
好,这就是创建socket
的所有过程~~