网络套接字编程

Posted 任我驰骋.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络套接字编程相关的知识,希望对你有一定的参考价值。

网络套接字

一、源IP地址和目的IP地址

在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址。
发送端为IP地址,目的端为目的IP地址。

二、端口号

端口号(port)是传输层协议的内容

端口号是一个2字节16位的整数;
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
一个端口号只能被一个进程占用

传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 “数据是谁发的, 要发给谁”;

另外, 一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定。

三、初步认识TCP协议和UDP协议

TCP特点

传输层协议
有连接
可靠传输
面向字节流

UDP特点

传输层协议
无连接
不可靠传输
面向数据报

四、socket编程接口

IP+端口号(port)就是端口号。
套接字编程本质上是进程间通信。

socket 常见API

sockaddr结构

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain
Socket。然而, 各种网络协议的地址格式并不相同。

五、TCP协议通讯流程

三次握手

服务器初始化:

  1. 调用socket, 创建文件描述符;
  2. 调用bind, 将当前的文件描述符和ip/port绑定在一起; 如果这个端口已经被其他进程占用了, 就会bind失败;
  3. 调用listen, 声明当前这个文件描述符作为一个服务器的文件描述符, 为后面的accept做好准备;
  4. 调用accecpt, 并阻塞, 等待客户端连接过来;

建立连接的过程:

  1. 调用socket, 创建文件描述符;
  2. 调用connect, 向服务器发起连接请求;
  3. connect会发出SYN段并阻塞等待服务器应答; (第一次)
  4. 服务器收到客户端的SYN, 会应答一个SYN-ACK段表示"同意建立连接"; (第二次)
  5. 客户端收到SYN-ACK后会从connect()返回, 同时应答一个ACK段; (第三次)

这个建立连接的过程, 通常称为 三次握手;

数据传输

  1. 建立连接后,TCP协议提供全双工的通信服务;
  2. 服务器从accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待;
  3. 这是客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服务器的应答
  4. 服务器调用write()将处理结果发回给客户端,再次调用read()阻塞等待下一条请求;
  5. 客户端收到后从read()返回,发送下一条请求,如此循环下去;

四次挥手

断开连接的过程:

  1. 如果客户端没有更多的请求了, 就调用close()关闭连接, 客户端会向服务器发送FIN段(第一次);
  2. 此时服务器收到FIN后, 会回应一个ACK, 同时read会返回0 (第二次);
  3. read返回之后, 服务器就知道客户端关闭了连接, 也调用close关闭连接, 这个时候服务器会向客户端发送
    一个FIN; (第三次)
  4. 客户端收到FIN, 再返回一个ACK给服务器; (第四次)

这个断开连接的过程, 通常称为 四次挥手。

这里有一个问题,connect方法阻塞长时间阻塞,如何解决?

最通常的方式最有效的是加定时器;也可以采用非阻塞模式。或者考虑采用异步传输机制。

六、总结网络编程一般步骤

TCP
Server端:create-bind-listen-accept-recv/send-close
Client端:create-connect-send/recv-close
UDP
Server端:create-bind–recv/send-close
Client端:create-send/recv-close

以上是关于网络套接字编程的主要内容,如果未能解决你的问题,请参考以下文章

高性能网络IO模型

华为顶级网络工程师分享出这份TCP/IP网络编程笔记!已封神

python之路——网络编程

《Python》网络编程之验证客户端链接的合法性socketserver模块

网络编程 -- 2019-08-08 18:01:52

网络编程 -- 2019-08-16 20:00:55