一、tcp与upd应用场景:
1. udp: 面向无连接的,可一对一或一对多,相对tcp速度更快,实时性更好,耗资源更少,但稳定性、可靠性比tcp差 - 多点通信,比如广播通信 - 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,更实时,使用UDP ,比如语音,实时视频 2. tcp: 面向连接,且一对一,比udp更稳定,可靠,适合通信质量要求较高的场景 http传输,文件传输,smtp等等,目前大部分的传输都会基于tcp协议传输 3. UDP与TCP的通信模型 a> udp通信模型 面向无连接, 好比写信模型,没有严格的服务端与客户端之分 b> tcp通信模型 面向连接的,好比打电话模型, 有严格的服务端与客户端之分二、udp网络程序
# -------------------------客户端----------------------------------- import socket def main(): # 1. 创建udp socket套接字对象 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2. 通过udp socket发送消息 # 2.1 准备目标主机的ip地址和端口号 dest_addr = ("192.168.236.129", 8080) # 是一个元组类型,第一个元素是字符串,是目标主机的ip的地址 # 第二个元素是整数 ,是目标主机的进程的端口号 # 2.2 取得要发送的数据 send_data = input("请输入要发送的数据:") # 2.3 发送数据到目标主机 udp_socket.sendto(send_data.encode("utf-8"), dest_addr) # 第一个参数是要发送的数据,第二个参数是目标主机地址 # 3. 等待从目标主机回传的消息 ,它是阻塞状态 recv_data = udp_socket.recvfrom(1024) # buffersize : 缓存的大小,一次最多接收多少字节的数据 # 4. 显示接收到的消息 # 回传的消息: (b'good', ('192.168.236.129', 8080)) # 元组类型,第一个元素是回传的消息 ,第二个是目标主机的ip和端口 recv_info=recv_data[0].decode("utf-8") # 解码,把字节串转换为字符串 recv_addr=str(recv_data[1]) print("接收到的消息:%s ,消息来自<<<%s" %(recv_info,recv_addr)) # 5. 关闭socket套接字 udp_socket.close() if __name__ == '__main__': main() # ----------------------------服务端--------------------------------- import socket def main(): # 1.创建udp 的socket套接字对象 udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 2. 绑定本机信息 udp_socket.bind(("", 7788)) # 3.接受来自客户端的信息 recv_data = udp_socket.recvfrom(1024) data = recv_data[0].decode("utf-8") print("接收到客户断的数据%s--->数据来自于%s" % (data, recv_data[1])) # 2发送数据 # 2.1 准备要发送的数据 send_data=input("请输入您要发送的额数据:") # 2.2 准备要发送哪个客户端的ip地址和端口号 addr_ip = "192.168." + input("请输入客户端的ip") addr_port = int(input("请输入客户端的端口号")) dest_addr = (addr_ip, addr_port) # 把字符串转化为字节串 data=send_data.encode("utf-8") # 编码 udp_socket.sendto(data,dest_addr) # 4. 关闭udp对象 udp_socket.close() if __name__ == '__main__': main()三、TCP网络程序-客户端(重点)
1. TCP客户端实现流程 1. 创建一个tcp的socket对象 2. 与tcp服务端建立连接 3. 使用tcp socket收发数据 4. 关闭连接 关闭tcp socket 就可以关闭连接 import socket # 创建socket tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 目的信息 server_ip = input("请输入服务器ip:") server_port = int(input("请输入服务器port:")) # 连接服务器 tcp_client_socket.connect((server_ip, server_port)) # 提示用户输入数据 send_data = input("请输入要发送的数据:") tcp_client_socket.send(send_data.encode("utf-8")) # 接收对方发送过来的数据,最大接收1024个字节 recvData = tcp_client_socket.recv(1024) print('接收到的数据为:', recvData.decode('utf-8')) # 关闭套接字 tcp_client_socket.close()四、TCP网络程序-服务端
1. tcp服务端创建流程 1. 创建服务端的server_socket,用于监听客户端的请求 2. 绑定端口 3. server_socket开启监听,由主动连接模式变为被动连接模式 4. 假如有客户端的请求,则立即接收,且创建一个与客户端对接的socket,与客户端通信 5. 使用新创建的socket与客户端通信 6. 关闭与客户端通信的socket,当该socket关闭,则不再与当前的客户端通信 7. 关闭用于监听的server_socket,当该socket关闭后,则不再接收新的客户端请求 # ---------------------------------服务端---------------------------- import socket # 1.创建socket tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.绑定本地信息 tcp_socket.bind(("", 8080)) # 3.开启监听 # socket默认是主动模式,listen()能改主动模式为被动模式, # backlog是指定tcp_socket可以同时接受多少个客服端的连接申请,超过则拒绝连接 tcp_socket.listen(5) # 4.创建新的套接字 # 服务器接收到请求之后,将生成一个新的套接字,专门给新来的客户端提供一对一的服务。 # 此时服务器的套接字的任务就是:等待新的客户端套接字连接它 new_socket, addr = tcp_socket.accept() # 生成一个新的套接字,接收客户端的地址+端口 # 5.收/发数据 content = new_socket.recv(1024) print(“接受到的数据:”,content.decode("utf-8")) data = input("服务器发送的数据:") new_socket.send(data.encode("utf-8")) # 6.关闭通信的socket new_socket.close() # 这个套接字关闭后,表示该套接字不再为当前客户端服务,需再创建新的套接字。 # 7.关闭用于监听的套接字 tcp_socket.close() # 该套接字关闭后不再接受新的客户端请求。一、Http协议认识
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84ECMA22-1572484913547)(assets/http协议介绍.png)]
1. http的认识 a> 什么是协议 通信双方的一种约定,一种规则,通信双方都认同和遵守,且按照这种约定或规则,能实现双方更好的,有条不紊的通信 b> http协议 1. http协议: 超文本传输协议(Hyper text transfer protocol) 用于web服务器与浏览器之间传输超文本(网页)的协议 2. http协议基于tcp/ip协议的 3. 网页是用html语言开发的 2. url url的格式二、http请求报文格式:
1. http请求报文格式组成 1. 请求行 [请求方式(get post) 请求路径 http版本] 2. 请求头 [请求头名称: 头值] 3. 空行 [\r\n] 作用: 把请求头与请求体分开 4. 请求体 [向服务端发送的请求参数] account=aaaaa&pwd=1234[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4z95ynK7-1572484913548)(assets/http请求报文格式.png)]
三、http协议响应报文格式:
1. 服务器---》浏览器客户端响应的数据格式: (www.baidu.com) HTTP/1.1 200 OK Server: Tengine Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive Date: Mon, 13 Aug 2019 12:14:21 GMT Accept-Ranges: bytes Via: cache24.l2et15-2[47,200-0,M], cache41.l2et15-2[48,0], kunlun6.cn191[114,200-0,M], kunlun10.cn191[114,0] X-Cache: MISS TCP_MISS dirn:-2:-2 mlen:-1 X-Swift-SaveTime: Mon, 13 Aug 2018 02:14:21 GMT X-Swift-CacheTime: 0 Timing-Allow-Origin: * EagleId: 78d1898a15341264616144025e 2. http响应报文格式组成: 第一部分: 响应行 [http协议版本 状态码 状态的描述] 第二部分: 响应头 [头名称: 头的值] 第三部分: 空行 [\r\n] 作用: 分割响应头与响应体 第四部分: 响应体: 网页的源码 3. 常见状态码 2xx 成功 比如200 OK www.baidu.com 3xx 重定向 比如307 Redirect www.taobao.cn/www.360buy.com 4xx 客户端错误 比如404 Not Found www.baidu.com/uuuu 5xx 服务端错误 比如500 Internal Server Error
二、浏览器访问网站的过程
a> 基本流程 用户输入网址. 浏览器请求DNS服务器, 获取域名对应的IP地址. 请求连接该IP地址服务器.(tcp) 发送资源请求. (HTTP协议 请求报文格式) web服务器接收到请求, 并解析请求, 判断用户意图. 获取用户想要的资源. 将资源返回给http服务器程序. http服务器程序将资源数据通过网络发送给浏览器. 浏览器解析呈现请求的数据. b> 域名与域名服务器 1. 域名(网站名称) www.sina.com.cn - www :服务器的类型,服务器名称 - sina : 机构名 - com: 机构类型 ,org, edu - cn: 国家名 jp, us 2. DNS域名服务器 存放 域名 与 ip地址的 关系 www.baidu.com --> 119.75.216.20三、tcp长连接与短连接(了解) a >短连接: 短连接实现流程:
1. 建立连接 2. 客户端向发送消息 3. 服务端响应回传消息给客户端 4. 完成一次发送与接收(读、写)服务 5. 关闭连接 短连接的特点: 1. 管理简单,占用资源相对长连接要少,但是每次请求都需要建立连接和释放连接 2. 适合于访问不频繁的操作,比如访问简单的web页面,一次用户注册,一次数据查询,一次文件下载 b >长连接: 长连接实现流程: 1. 建立连接 2. 客户端向服务端发送消息 3. 服务端响应回传消息 4. 一次请求响应结束后,当前连接不关闭 5. 通过当前连接实现多次通信 6. 关闭连接: 客户端关闭连接,服务端依据连接的超时时间(timeout)关闭连接 长连接的特点: 1. 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。但长连接数太多会影响服务端性能,服务端可以通过设置最大连接数和对长连接设置timeout(超时时间)来管理长连接数量 2. 适合于访问频繁的操作,比如即使通信,请求复杂的web页面四、tcp/ip协议(了解) 1. 计算机网络界通过tcp/ip协议来实现通信
2. tcp/ip是协议族,重要的是tcp和ip两个协议  3. tcp/ip分为4层模型: 1. 网络接口层(物理层、数据链路层):包括传输介质(网线)、计算机中对应的网络接口卡等 2. 网络层(互联网层):主要用IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由 3. 传输层:主要为两台主机上的应用提供端到端的通信. 4. 应用层:为用户提供具体的服务,比如http服务,ftp服务,smtp服务等.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXg6F5ny-1572484913550)(assets/1568651326483.png)]
五、http通信体验
1. 模拟浏览器访问服务端 tcp的客户端 (www.xiaoniangao.cn) 步骤: 1. 创建tcp的socket 2. 与服务端建立连接 3. 发送要请求的数据(http请求报文格式数据) 4. 接收服务端回传的数据(http响应报文格式的数据) 5. 关闭连接 参考代码: 01http_client.py 2. 简单版http服务器实现 tcp的服务器 步骤分析: 1. tcp的服务端 2. tcp服务端取得浏览器客户端的http的请求报文格式数据 3. 组拼响应http报文格式的数据给请求的浏览器 参考代码: 02http_server.py 其他、 1. url: 统一资源定位器,俗称网址(网络数据的地址) http://tieba.baidu.com/index.html 1. 第一个部分: 协议名,http协议,ftp协议,svn协议,xmpp协议 2. 主机名,域名,ip地址 ,www.baidu.com 3. 端口,http服务用的是80端口,也是默认的端口,可以不写 4. 请求路径:/index.shtml 2. cookie介绍 存储在本地的用户访问域名(网站)的信息,不同的域名(网站)有不同的cookie 好处:可以自动把用户访问域名的信息传递给服务端 不足:存在安全隐患 3. 常用头部说明 1. 请求头部 Host、User-Agent、Accept、Accept-Encoding 2. 响应头部 Server(服务器名称) Date(响应时间) 3. 通用头部 Connection(连接方式) 4. 实体头部(响应体和请求体) Content-Type(内容类型) Content-Encoding(内容压缩方式) Content-Length(内容长度) 4. get与post的区别 1:get重点在从服务器上获取资源,post重点在向服务器发送数据,get请求是默认的请求方式 2:get传输数据是附在URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的; 3:Get传输的数据量小,因为受URL长度限制;Post可以传输大量数据,所以上传文件时只能用Post方式; 4:get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等,post较get安全性较高;
内容长度)
get与post的区别 1:get重点在从服务器上获取资源,post重点在向服务器发送数据,get请求是默认的请求方式 2:get传输数据是附在URL后,并用"?“连接,多个请求数据间用”&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的; 3:Get传输的数据量小,因为受URL长度限制;Post可以传输大量数据,所以上传文件时只能用Post方式; 4:get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等,post较get安全性较高;