使用 udp 发送/接收数据步骤:
1.创建客户端套接字
2.发送/接收数据
3.关闭套接字
1.import socket
2.def main():
3. # 1、创建 udp 套接字
4. # socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
5. # socket.SOCK_DGRAM 数据报套接字,只要用于 udp 协议
6. udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
7.
8. # 2、准备接收方的地址
9. # 元组类型 ip 是字符串类型 端口号是整型
10. dest_addr = (‘192.168.113.111’, 8888)
11. # 要发送的数据
12. send_data = “我是要发送的数据” 13. # 3、发送数据
14. udp_socket.sendto(send_data.encode(“utf-8”), dest_addr)
15. # 4、等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据
16. # 接收到的数据是一个元组 (接收到的数据, 发送方的 ip 和端口)
17. # 1024 表示本次接收的最大字节数
18. recv_data, addr = udp_socket.recvfrom(1024) 19. # 5、关闭套接字
20. udp_socket.close()
21.if name == ’ main ':
22. main()
编码的转换
str -->bytes: encode 编码 bytes–> str: decode()解码
UDP 绑定端口号:
1.创建 socket 套接字
2.绑定端口号
3.接收/发送数据
4.关闭套接字
1.import socket2.def main(): | |||
---|---|---|---|
3.4. | # 1、创建 udp 套接字# socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议 | ||
5. | # | socket.SOCK_DGRAM 数据报套接字,只要用于 udp 协议 | |
6.7.8.9.10 | . | udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2、绑定端口# 元组类型 ip 一般不写 表示本机的任何的一个 ip local_addr = (’’, 7777) udp_socket.bind(local_addr) | |
11. # 3、准备接收方的地址12. # 元组类型 ip 是字符串类型 端口号是整型13. dest_addr = (‘192.168.113.111’, 8888) |
14. # 要发送的数据
15. send_data = “我是要发送的数据” 16. # 4、发送数据
17. udp_socket.sendto(send_data.encode(“utf-8”), dest_addr)
18. # 5、等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据
19. # 接收到的数据是一个元组 (接收到的数据, 发送方的 ip 和端口)
20. # 1024 表示本次接收的最大字节数
21. recv_data, addr = udp_socket.recvfrom(1024) 22. # 6、关闭套接字
23. udp_socket.close()
24.if name == ’ main ':
25. main()
注意点:绑定端口要在发送数据之前进行绑定。
TCP 客户端的创建流程:
1.创建 TCP 的 socket 套接字
2.连接服务器
3.发送数据给服务器端
4.接收服务器端发送来的消息
5.关闭套接字
1.import socket
2.def main():
3. # 1、创建客户端的 socket
4. # socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
5. # socket.SOCK_STREAM 流式套接字,只要用于 TCP 协议
6. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7. # 2、构建目标地址
8. server_ip = input(“请输入服务器端的 IP 地址:”)
9. server_port = int(input(“请输入服务器端的端口号:”)) 10. # 3、连接服务器
11. # 参数:元组类型 ip 是字符串类型 端口号是整型 12. client_socket.connect((server_ip, server_port))
13. # 要发送给服务器端的数据
14. send_data = “我是要发送给服务器端的数据”
15. # 4、发送数据
16. client_socket.send(send_data.encode(“gbk”)) 17. # 5、接收服务器端恢复的消息, 没有消息会阻塞
18. # 1024 表示接收的最大字节数
19. recv_date= client_socket.recv(1024)
20. print(“接收到的数据是:”, recv_date.decode(‘gbk’)) 21. # 6、关闭套接字
22. client_socket.close()
23.if name == ’ main ':
24. main()
TCP 服务器端的创建流程
1.创建 TCP 服务端的 socket
2.bing 绑定 ip 地址和端口号
3.listen 使套接字变为被动套接字
4.accept 取出一个客户端连接,用于服务
5.recv/send 接收和发送消息
6.关闭套接字
1.import socket
2.
3.def main():
4. # 1、创建 tcp 服务端的 socket
5. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6.
7. # 2、绑定
8. server_socket.bind((’’, 8888)) 9.
10. # 3、listen 使套接字变为被动套接字 11. server_socket.listen(128)
12.
13. # 4、如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务 14. # client_socket 用来为这个客户端服务
15. # tcp_server_socket 就可以省下来专门等待其他新客户端的链接 16. client_socket, client_addr = server_socket.accept()
17.
18. # 5、接收客户端发来的消息
19. recv_data = client_socket.recv(1024)
20. print(“接收到客户端%s 的数据:%s” % (str(client_addr), recv_data.decode(‘gbk’))) 21.
22. # 6、回复数据给客户端
23. client_socket.send(“收到消息”.encode(‘gbk’)) 24.
25. # 7、关闭套接字 26. client_socket.close()
27. server_socket.close() 28.
29.if name == ’ main ':
30. main()
注意点:
· tcp 服务器一般都需要绑定,否则客户端找不到服务器
· tcp 客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的 ip、port 等信息就好, 本地客户端可以随机
· tcp 服务器中通过 listen 可以将 socket 创建出来的主动套接字变为被动的,这是做 tcp 服务器 时必须要做的
· 当客户端需要链接服务器时,就需要使用 connect 进行链接,udp 是不需要链接的而是直接发送,但是 tcp 必须先链接,只有链接成功才能通信
· 当一个 tcp 客户端连接服务器时,服务器端会有 1 个新的套接字,这个套接字用来标记这个客户 端,单独为这个客户端服务
· listen 后的套接字是被动套接字,用来接收新的客户端的连接请求的,而 accept 返回的新套接 字是标识这个新客户端的
· 关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之 前已经链接成功的客户端正常通信。
· 关闭 accept 返回的套接字意味着这个客户端已经服务完毕
· 当客户端的套接字调用 close 后,服务器端会 recv 解阻塞,并且返回的长度为 0,因此服务器可 以通过返回数据的长度来区别客户端是否已经下线;同理 当服务器断开 tcp 连接的时候 客户端 同样也会收到 0 字节数据。
在 socket 通信过程中不断循环检测一个全局变量(开关标记变量),一旦标记变量变为关闭,则 调 用 socket 的 close 方法,循环结束,从而达到关闭连接的目的。
UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。
优点:UDP 速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送 缺点:UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数 据是否会正确接收,也不重复发送,不可靠。
TCP 是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
优点:TCP 在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。 缺点:TCP 相对于 UDP 速度慢一点,要求系统资源较多。
1.发送 http 请求动态资源给 web 服务器
2.web 服务器收到请求后通过 WSGI 调用一个属性给应用程序框架
3.应用程序框架通过引用 WSGI 调用 web 服务器的方法,设置返回的状态和头信息。
4.调用后返回,此时 web 服务器保存了刚刚设置的信息
5.应用程序框架查询数据库,生成动态页面的 body 的信息
6.把生成的 body 信息返回给 web 服务器
7.web 服务器吧数据返回给浏览器
先要解析出 baidu.com 对应的 ip 地址
· 要先使用 arp 获取默认网关的 mac 地址
· 组织数据发送给默认网关(ip 还是 dns 服务器的 ip,但是 mac 地址是默认网关的 mac 地址)
· 默认网关拥有转发数据的能力,把数据转发给路由器
· 路由器根据自己的路由协议,来选择一个合适的较快的路径转发数据给目的网关
· 目的网关(dns 服务器所在的网关),把数据转发给 dns 服务器
· dns 服务器查询解析出 baidu.com 对应的 ip 地址,并原路返回请求这个域名的 client 得到了 baidu.com 对应的 ip 地址之后,会发送 tcp 的 3 次握手,进行连接
· 使用 http 协议发送请求数据给 web 服务器
· web 服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器。
· 浏览器接收到数据之后通过浏览器自己的渲染功能来显示这个网页。
· 浏览器关闭 tcp 连接,即 4 次挥手结束,完成整个访问过程
GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&连接。URL 的 编码格式采用的是 ASCII 编码,而不是 uniclde,即是说所有的非 ASCII 字符都要编码之后再传输。
POST 请求:POST 请求会把请求的数据放置在 HTTP 请求包的包体中。上面的 item=bandsaw 就 是实际的传输数据。
因此,GET 请求的数据会暴露在地址栏中,而 POST 请求则不会。 传输数据的大小:
· 在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限制。但是在实际开发过程中,对 于 GET,特定的浏览器和服务器对 URL 的长度有限制。因此,在使用 GET 请求时,传输数据会 受到 URL 长度的限制。
· 对于 POST,由于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST 提交数据大小进行限制,Apache、IIS 都有各自的配置。
安全性:
· POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面 GET 提到的安全方法 中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过 GET 请求, 用户名和密码都会暴露再 URL 上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的
历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET 请求提交的数据
还可能会造成 Cross-site request frogery 攻击。 效率:GET 比 POST 效率高。
POST 请求的过程:
(1).浏览器请求 tcp 连接(第一次握手)
(2).服务器答应进行 tcp 连接(第二次握手)
(3).浏览器确认,并发送 post 请求头(第三次握手,这个报文比较小,所以 http 会在此时进行 第一次数据发送)
(4).服务器返回 100 continue 响应 5.浏览器开始发送数据
(5).服务器返回 200 ok 响应 GET 请求的过程:
(1).浏览器请求 tcp 连接(第一次握手)
(2).服务器答应进行 tcp 连接(第二次握手)
(3).浏览器确认,并发送 get 请求头和数据(第三次握手,这个报文比较小,所以 http 会在此时 进行第一次数据发送)
(4).服务器返回 200 OK 响应
(1)cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
(2)cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗考虑到安全应当使 用 session。
(3)session 会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用 cookie。
(4)单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
(5)建议: 将登陆信息等重要信息存放为 SESSION 其他信息如果需要保留,可以放在 cookie 中
通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。 常见的状态机器码有:
100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200-299:表示服务器成功接收请求并已完成处理过程,常用 200(OK 请求成功)。
300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的 url)。
304、307(使用缓存资源)。
400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面),403(服务器拒绝访问, 权限不够)。
500-599:服务器端出现错误,常用 500(请求未完成,服务器遇到不可预知的情况)。
三次握手过程:
(1)首先客户端向服务端发送一个带有 SYN 标志,以及随机生成的序号 100(0 字节)的报文
(2)服务端收到报文后返回一个报文(SYN200(0 字节),ACk1001(字节+1))给客户端
(3)客户端再次发送带有 ACk 标志 201(字节+)序号的报文给服务端 至此三次握手过程结束,客户端开始向服务端发送数据。
1客户端向服务端发起请求:我想给你通信,你准备好了么?
2服务端收到请求后回应客户端:I’ok,你准备好了么
3客户端礼貌的再次回一下客户端:准备就绪,咱们开始通信吧!
整个过程跟打电话的过程一模一样:1 喂,你在吗 2 在,我说的你听得到不 3 恩,听得到(接下来请 开始你的表演)
补充:SYN:请求询问,ACk:回复,回应。
四次挥手过程:
由于 TCP 连接是可以双向通信的(全双工),因此每个方向都必须单独进行关闭(这句话才是 精辟,后面四个挥手过程都是其具体实现的语言描述)
四次挥手过程,客户端和服务端都可以先开始断开连接
(1)客户端发送带有 fin 标识的报文给服务端,请求通信关闭
(2)服务端收到信息后,回复 ACK 答应关闭客户端通信(连接)请求
(3)服务端发送带有 fin 标识的报文给客户端,也请求关闭通信
(4)客户端回应 ack 给服务端,答应关闭服务端的通信(连接)请求
主动发送 fin 关闭的一方,在 4 次挥手最后一次要等待一段时间我们称这段时间为 2MSL TIME_WAIT 状态的存在有两个理由:
1.让 4 次挥手关闭流程更加可靠
2.防止丢包后对后续新建的正常连接的传输造成破坏
1、为了保证客户端发送的最后一个 ACK 报文段能够达到服务器。 这个 ACK 报文段可能丢失, 因而使处在 LAST-ACK 状态的服务器收不到确认。服务器会超时重传 FIN+ACK 报文段,客户端就 能在 2MSL 时间内收到这个重传的 FIN+ACK 报文段,接着客户端重传一次确认,重启计时器。最 好,客户端和服务器都正常进入到 CLOSED 状态。如果客户端在 TIME-WAIT 状态不等待一段时间, 而是再发送完 ACK 报文后立即释放连接,那么就无法收到服务器重传的 FIN+ACK 报文段,因而也 不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入 CLOSED 状态。
2、防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 确认报文段 后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样 就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安 全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer)协议用于 对 HTTP 协议传输的数据进行加密,从而就诞生了 HTTPS。简单来说,HTTPS 协议是由 SSL+HTTP 协 议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全。
HTTPS 和 HTTP 的区别主要如下:
1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、
身份认证的网络协议,比 http 协议安全。
HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。 HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体
信息系统。它于 1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在 WWW 中 使用的是 HTTP/1.0 的第六版,HTTP/1.1 的规范化工作正在进行之中,而且 HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP 协议工作于客户端-服务端架构为上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服 务端即 WEB 服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。
表示数据类型字段: Content-Type
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
1、 GET 请求指定的页面信息,并返回实体主体。
2、HEAD 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头
3、POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4、PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5、DELETE 请求服务器删除指定的页面。
6、CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7、OPTIONS 允许客户端查看服务器的性能。
8、TRACE 回显服务器收到的请求,主要用于测试或诊断。
Address Family 和 Type,分别表示套接字应用场景和类型。
family 的值可以是 AF_UNIX(Unix 域,用于同一台机器上的进程间通讯),也可以是 AF_INET(对于 IPV4 协议的 TCP 和 UDP),至于 type 参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw 套接字)。
\1. Host (主机和端口号)
2.Connection (链接类型)
3.Upgrade-Insecure-Requests (升级为 HTTPS 请求)
4.User-Agent (浏览器名称)
5.Accept (传输文件类型)
6.Referer (页面跳转处)
7.Accept-Encoding(文件编解码格式)
8.Cookie (Cookie)
9.x-requested-with :XMLHttpRequest (是 Ajax 异步请求)
IP: 网络层
TCP/UDP: 传输层
HTTP、RTSP、FTP: 应用层协议
形式: scheme://host[:port#]/path/…/[?query-string][#anchor] scheme:协议(例如:http, https, ftp)
host:服务器的 IP 地址或者域名
port:服务器的端口(如果是走协议默认端口,80 or 443)
path:访问资源的路径
query-string:参数,发送给 http 服务器的数据 anchor:锚(跳转到网页的指定锚点位置) http://localhost:4000/file/part01/1.2.html