1.IP地址的概念
IP地址就是标识网络中设备的一个地址,好比现实生活中的家庭地址。
作用:通过IP地址能够找到网络中的某台设备
注:网络设备不止是电脑,还包括手机,ipad等可上网的设备
说明:
IP地址分为两类:IPV4和IPV6
- IPv4是IP的第四个版本是我们目前使用最普遍的版本,由点分十进制组成(0-255)采用32位的二进制数来表示IP地址一共有2的32次方地址数差不多43亿,每一个上网的设备都需要一个IP地址,以目前来看是远远不够的。
- IPV6地址是128位的由冒号十六进制组成,目前还很少有能看到使用,在未来会用的因为IPV4地址资源基本不够用了
查看IP地址
- linux和macos使用ifconfig这个命令
- windows使用ipconfig命令
说明:
- 比如192.168.1.xx 是设备在网络中的IP地址代表当前设备在网络的地址
- 127.0.0.1表示本机回环地址。如果和自己的电脑通信就可以使用该地址
- 127.0.0.1该地址的域名是localhost,域名是ip地址的别名,通过域名可以解析出一个对应的ip地址
注:127.0.0.1被称为本地环回地址:为什么会被称为本地回环地址呢?
假如我们有一个客户端和服务端的应用程序,正常来说客户端向服务端发送请求,服务端将数据返回给客户端。要实现这一通信条件:客户端和服务端需要两个不同的ip地址。
如果我们需要在本地测试这一应用程序
第一步:我们可以讲本地ip地址当作客户端的地址;
第二步:再把127.0.0.1当作服务端的地址
这样就可以用本地Ip当作客户端向127.0.0.1这个服务端发送请求了
这里提一下本地ip的意思是你只要处于一个网络中,你在该网络中就会有ip,这就是本地ip。正常我们开发测试都会使用127.0.0.1这个地址来测试我们的程序,另外可以ping 127.0.0.1这个地址来确定本机的TCP/IP是否正常,说白了就是把本机作为服务器,同时也把本机作为客户端
2.端口
不同电脑的QQ之间进行数据通信,它是如何保证把数据发给QQ而不是发给其他应用程序?
其实,每运行一个网络应用程序就会有一个端口,想要给对应的程序发送数据只要找到对应的端口就行了
什么是端口?
端口就是传输数据的通道,好比教室的门,是数据传输的必经之路。
那么如何准确的找到对应的端口呢?
其实每一个端口都会有一个对应的端口号,好比教室的门都有一个门牌号,想要找到端口通过端口号即可
什么是端口号?
操作系统为了统一管理这么多端口就对端口进行了编号,这就是端口号,端口号就是一个数字,好比我们现实生活中的门牌号。
门牌号有65536个。那么最终飞秋之间进行数据通信的流程是这样的,通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据传输给对应的应用程序
端口号分类
知名端口号:
知名端口奥是指众所周知的端口号,范围是0到1023.
这些端口号一般固定分配给一些服务,比如21端口分配给FTP(文件传输协议)服务,25端口分配给SMTP(邮件传输协议)服务,80分配给HTTP服务
动态端口号:
一般程序员开发应用程序使用的端口号称为动态端口号,范围是从1024到65535.
如果程序在开发阶段没有设置端口号,操作系统就会在动态端口号这个范围内随机生成一个给开发的应用程序使用
运行一个程序就默认会有一个端口号,当这个程序退出时所占用的端口号就会被释放
综上:
端口的作用就是给运行的应用程序提供传输数据的通道
端口号的作用是用来区分和管理不同端口的,通过端口号能找到唯一的一个端口
TCP
1.网络应用程序之间的通信流程
上面说了IP地址和端口号。通过IP地址可以找到对应的设备,然后通过端口号找到对应的端口,再通过端口把数据传输给应用程序,这里要注意,数据不能随便发送,再发送之前还需要选一个对应的传输协议,保证程序之间按照指定的传输规则进行数据的通信,这个传输协议就是TCP
TCP的概念
TCP 的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的,可靠的,基于字节流的传输层通信协议
TCP通信步骤:
- 创建连接
- 传输数据
- 关闭连接
注:TCP通信模型相当于我们生活中打电话,在通信开始之前一定要先建立号连接才能进行童话相当于发送数据,通话结束挂断电话相当于关闭连接
1.面向连接
通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接以释放系统资源
2.可靠传输
TCP采用发送应答机制
超时的话重新传送
错误校验
流量控制和阻塞管理
综上:TCP是一个稳定,可靠的传输协议,常用于对数据进行准确无误的传输;比如:文件下载,浏览器上网
1. 问题思考
上门说了 ip 地址和端口号还有 tcp 传输协议,为了保证数据的完整性和可靠性我们使用 tcp 传输协议进行数据的传输,为了能够找到对应设备我们需要使用 ip 地址,为了区别某个端口的应用程序接收数据我们需要使用端口号,那么通信数据是如何完成传输的呢?
使用 socket来完成
sorket的概念
sorket(简称套接字)是进程之间通信的一个工具(打开一个应用程序就相当于一个进程),好比现实生活中的插座,所以的家用电器想要工作都是基于插座进行,进程之间想要进行网络通信要基于socket
sorket的作用
负责进程之间的网络数据传输,好比数据的搬运工
sorket的使用场景
不夸张的说,只要跟网络相关的应用程序或者软件都是用到了socket。比如微信,QQ
TCP网络应用程序开发流程介绍
TCP网络应用程序开发分文:
TCP客户端程序开发
TCP服务端程序开发
说明:
客户端程序是指运行在用户设备上的程序,服务端程序是指运行在服务端上的程序,专门为客户端提供数据服务
比如QQ是运行在客户端的,在一台电脑上登录两个QQ,但是数据并不是从一个QQ直接传给另一个QQ的,而实先传给QQ服务器,然后由服务端再进行转发
如下图:
客户端步骤:
步骤说明:
- 创建客户端套接字对象
- 和服务端套接字建立连接
- 发送数据
- 接收数据
- 关闭客户端套接字
服务端步骤:
步骤说明:
- 创建服务端端套接字对象
- 绑定端口号
- 设置监听
- 等待接受客户端的连接请求
- 接收数据
- 发送数据
- 关闭套接字
综上: - TCP 网络应用程序开发分为客户端和服务端开发
- 主动发起建立连接请求的是客户端程序
- 等待接受连接请求的是服务端程序
客户端开发步骤
import socket
if __name__ == '__main__':
# 创建TCP客户端socket(套接字)对象
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 和服务端程序建立连接
tcp_client_socket.connect(('192.168.x.x',8080))
#准备发送数据 编码要看使用的是什么系统,ubuntu是utf-8,windows使用的是gbk
send_data = '你好服务端'.encode('gbk')
# 发送数据
tcp_client_socket.send(send_data)
# 接收数据,接收单次数据最大字节是1024
recv_data = tcp_client_socket.recv(1024)
# 返回的是服务器程序发送的二进制数据,需要解码
recv_content = recv_data.decode('gbk')
print('接收到服务端的数据为:',recv_content)
# 关闭套接字
cp_client_socket.close()
在开发客户端的时候可以用网络调试助手充当服务端进行测试
综上
1.导入socket模块
2.创建TCP套接字‘socket’
参数1: ‘AF_INET’, 表示IPv4地址类型
参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
3.发送数据‘send’
参数1: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
4.接收数据‘recv’
参数1: 表示每次接收数据的大小,单位是字节
5.关闭套接字‘socket’表示通信完成
服务端开发步骤
# 1.创建服务端socket
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 设置端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2.绑定端口 绑定内是一个元组 (本地IP地址,端口号
#本地IP地址可以不指定,表示本地任意IP
tcp_server_socket.bind(('',8080))
# 3.设置监听模式
# 1)使的tcp_server_socket为被动连接套接字
# 2)128:最大等待连接个数
tcp_server_socket.listen(128)
# 4.等待客户端连接(一旦有客户端连接,会返回新的socket)
# accept :阻塞等待客户端连接
# 一旦有客户连接:返回元组,可以拆包成新的socket,客户端的IP和端口信息
new_socket,client_ip_port = tcp_server_socket.accept()
# 5.使用新的socket接收消息
recv_data = new_socket.recv(1024)
print('接收到客户端发送的消息:',recv_data.decode('gbk'))
# 6.使用新的socket发送消息
send_data= '你好,客户端'.encode('gbk')
new_socket.send(send_data)
# 7.关闭新的socket
new_socket.close()
# 关闭服务器socket
tcp_server_socket.close()
可以用网络调试助手充当客户端
说明:
当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟。
解决办法有两种:
- 更换服务端端口号
- 设置端口号复用(推荐大家使用),也就是说让服务端程序退出后端口号立即释放。
端口复用并不是说一个端口多个热使用,而是程序结束端口没有被立即释放
# 参数1: 表示当前套接字
# 参数2: 设置端口号复用选项
# 参数3: 设置端口号复用选项对应的值
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
TCP网络应用程序的注意点
1.当TCP客户端程序想要和TCP服务端进行通信的时候必须先建立连接
2.TCP客户端程序一般不需要绑定端口号,因为客户端是主动发起请求建立连接的,系统会给客户端动态分配端口
3.TCP服务端必须绑定端口号,否则客户端找不到服务端
4.listen后的套接字是被动套接字,只负责接受新的客户端的连接请求不能收发消息
5.当TCP客户端程序和TCP服务端程序连接成功后,TCP服务端会产生一个新的套接字,手法客户端消息使用该新套接字
6.关闭new_socket.close 意味这和这个客户端已经通信完毕
7.关闭listen后的套接字意味这服务端套接字关闭,客户端就不能再连接服务端,但是之前已经连接成功的客户端还能正常通信
8.当客户端套接字调用close后,服务端的recv会解阻塞,返回的数据长度为0,服务端可以通过返回数据长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的recv也会解阻塞,返回的数据长度也为0
socket之send和recv原理剖析
- 认识TCP socket的发送和接收缓冲区
当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区指的就是内存中的一片空间。 - send原理剖析
send是不是直接把数据发给服务端?
不是,要想发送数据,必须通过网卡发送数据,应用程序是无法通过网卡发送数据的,它需要调用操作系统接口,也就是说,应用程序把发送的数据先写入到发送缓存区(内存中的一片空间),再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡 - recv原理剖析
recv是不是直接从客户端接收数据?
不是,应用程序时无法直接通过网卡接收数据的,它需要调用操作系统接口,由操作系统网卡接收数据,把接收的数据写入到接收缓存区(内存中的一片空间),应用程序再从接收缓存区获取客户端发送的数据
小结
不管是recv还是send都不是直接接收到对方的数据和发送数据到对方,发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取,发送数据和接收数据最终是由操作系统控制网卡来完成。
以字节流的方式传输数据
HTTP 协议
HTTP 协议的全称是(HyperText Transfer Protocol),翻译过来就是超文本传输协议
超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片、音乐、视频、超链接等等都属于超文本。
HTTP 协议设计之前目的是传输网页数据的,现在允许传输任意类型的数据。
传输 HTTP 协议格式的数据是基于 TCP 传输协议的,发送数据之前需要先建立连接。
HTTP 协议的作用
它规定了浏览器和 Web 服务器通信数据的格式,也就是说浏览器和web服务器通信需要使用http协议。 (重点:规定了数据的格式)
URL的概念
统一资源定位符,通俗理解就是网络资源地址,也就是我们常说的网址。
URL的组成
URL的样子:
https://news.163.com/18/1122/10/E178J2O4000189FH.html
URL的组成部分:
- 协议部分**: https://、http://、ftp://
- 域名部分**: news.163.com
- 资源路径部分**: /18/1122/10/E178J2O4000189FH.html
域名:
域名就是IP地址的别名,它是用点进行分割使用英文字母和数字组成的名字,使用域名目的就是方便的记住某台主机IP地址。
-
HTTP 请求报文介绍
HTTP最常见的请求报文有两种: -
GET 方式的请求报文
-
POST 方式的请求报文
说明:
- GET: 获取web服务器数据
- POST: 向web服务器提交数据