目录
网络编程
1.网络编程基础知识
1.1 什么是网络
1.2 网络协议
OSI 7层模型
TCP/IP模型
1.3 Linux Windows 命令行查看网络信息
1.4 IP地址
1.4.1 概念:
1.4.2 IP地址分类:
1.5 端口
1.5.1 概念
1.6 服务器和客户端
1.6.1 服务端(Server):
1.6.2 客户端(Client) :
2.传输方法
2.1套接字简介
2.2 套接字类型
1. 流套接字(SOCK_STREAM)
2. 数据报套接字(SOCK_DGRAM)
3. 原始套接字(SOCK_RAW)
2.3 UDP套接字编程
2.3.1 UDP套接字特点
2.3.2 UDP套接字传输服务端客户端流程图
2.3.3 UDP实现代码
2.4 TCP 传输方法
2.4.1 TCP传输特点
2.4.2 TCP套接字传输服务端客户端流程图
三次握手(建立连接)
四次挥手(断开连接)
2.4.3 TCP服务端(实现代码)
2.4.4 TCP客户端(实现代码)
2.4.5 TCP套接字细节
2.5 TCP与UDP对比
什么是网络 : 计算机网络功能主要包括实现资源共享,实现数据信息的快速传递。
Linux: ifconfig
windows: ipconfig
开/关网卡:sudo ifconfig ###(网卡名) up/down
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
TCP/IP协议 之IPV4与IPV6的区别;5G无线通信与4G的典型区别有哪些?_洋葱专栏-有灵魂的程序员-CSDN博客
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。
真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。
我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。
那么,主机是怎样区分不同的网络服务呢?
显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。
需要注意的是,端口并不是一一对应的。
比如你的电脑作为客户机访 问一台WWW服务器时,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口。
网络端口的作用及分类_TerryZjl的博客-CSDN博客_端口
服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据,处理客户端请求等。
也称为用户端,是指与服务端相对应,为客户提供一定应用功能的程序,我们平时使用的手机或者电脑上的程序基本都是客户端程序
流套接字用于提供面向连接、可靠的数据传输服务。
该服务将保证数据能够实现无差错、无重复送,并按顺序接收。
流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议
2. 数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接的服务。
该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理 。
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:
原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。
因此,如果要访问其他协议发送的数据必须使用原始套接 。
创建UDP套接字
sockfd=socket.socket(socket_family,socket_type,proto=0)
功能:创建套接字
参数:
socket_family 网络地址类型 AF_INET表示ipv4
socket_type 套接字类型 SOCK_DGRAM 表示udp套接字 (也叫数据报套接字)
proto 通常为0 选择子协议 返回值: 套接字对象
绑定地址
sockfd.bind(addr)
功能: 绑定本机网络地址
参数: 二元元组 (ip,port) ('0.0.0.0',8888)
消息收发
接收消息:
data,addr = sockfd.recvfrom(buffersize)
功能: 接收UDP消息
参数: 每次最多接收多少字节
返回值:
data 接收到的内容
addr 消息发送方地址
发送消息:
n = sockfd.sendto(data,addr)
功能: 发送UDP消息
参数:
data 发送的内容 bytes格式
addr 目标地址
返回值:发送的字节数
关闭套接字
sockfd.close()
功能:关闭套接字
a.创建套接字
sockfd=socket.socket(socket_family,socket_type,proto=0)
功能:创建套接字
参数:
socket_family 网络地址类型 AF_INET表示ipv4
socket_type 套接字类型 SOCK_STREAM 表示tcp套接字 (也叫流式套接字)
proto :通常为0 选择子协议
返回值: 套接字对象
sockfd.bind(addr)
功能: 绑定本机网络地址
参数: 二元元组 (ip,port) ('0.0.0.0',8888)
sockfd.listen(n)
功能 : 将套接字设置为监听套接字,确定监听队列大小
参数 : 监听队列大小
d.处理客户端连接请求
connfd,addr = sockfd.accept()
功能: 阻塞等待处理客户端请求
返回值: connfd 客户端连接套接字
addr 连接的客户端地址
e.消息收发
接收消息:
data = connfd.recv(buffersize)
功能 : 接受客户端消息
参数 :每次最多接收消息的大小
返回值: 接收到的内容
发送消息:
n = connfd.send(data)
功能 : 发送消息
参数 :要发送的内容 bytes格式
返回值: 发送的字节数
f. 关闭套接字 (与udp套接字相同)
sockfd.close()
功能:关闭套接字
创建套接字
sockfd.connect(server_addr)
功能:连接服务器
参数:元组 服务器地址
实际网络工作过程比较复杂,导致消息收发速度不一致 tcp以字节流方式
带来的影响
进行数据传输,在接收时不区分消息边界