UDP总结
- 创建客户端套接字socket
- 发送/接收数据
- 关闭套接字socket
-
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) 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绑定端口号
创建socket
绑定端口号
接收/发送数据
关闭套接字
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. # 2、绑定端口 8. # 元组类型ip 一般不写表示本机的任何的一个ip 9. local_addr = ('', 7777) 10. 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总结
- tcp客户端的创建流程:
创建tcp的套接字
链接服务器
发送数据给服务器端
接收服务器端发送的消息
关闭套接字
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()
当客户端需要链接服务器时,就需要使用connect 进行链接,udp 是不需要链接的而是直接发 送,但是tcp 必须先链接,只有链接成功才能通信 当一个tcp 客户端连接服务器时,服务器端会有1 个新的套接字,这个套接字用来标记这个客户 端,单独为这个客户端服务 listen 后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept 返回的新套接 字是标识这个新客户端的 关闭listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之 前已经链接成功的客户端正常通信。 关闭accept 返回的套接字意味着这个客户端已经服务完毕 当客户端的套接字调用close 后,服务器端会recv 解阻塞,并且返回的长度为0,因此服务器可 以通过返回数据的长度来区别客户端是否已经下线;同理当服务器断开tcp 连接的时候客户端 同样也会收到0 字节数据。
总结
- 怎么实现强行关闭客户端和服务器之间的连接?
在socket 通信过程中不断循环检测一个全局变量(开关标记变量),一旦标记变量变为关闭,则调
用socket 的close 方法,循环结束,从而达到关闭连接的目的。 - 简述TCP 和UDP 的区别以及优缺点?
UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。
优点:UDP 速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送
缺点:UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数
据是否会正确接收,也不重复发送,不可靠。TCP 是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
优点:TCP 在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。
缺点:TCP 相对于UDP 速度慢一点,要求系统资源较多。 - 简述浏览器通过WSGI 请求动态资源的过程?
1.发送http 请求动态资源给web 服务器
2.web 服务器收到请求后通过WSGI 调用一个属性给应用程序框架
3.应用程序框架通过引用WSGI 调用web 服务器的方法,设置返回的状态和头信息。
4.调用后返回,此时web 服务器保存了刚刚设置的信息
5.应用程序框架查询数据库,生成动态页面的body 的信息
6.把生成的body 信息返回给web 服务器
7.web 服务器吧数据返回给浏览器 - 描述用浏览器访问www.baidu.com 的过程?
先要解析出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 次挥手结束,完成整个访问过程 - Post 和Get 请求的区别?
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.浏览器开始发送数据
6.服务器返回200 ok 响应
GET 请求的过程:
1.浏览器请求tcp 连接(第一次握手)
2.服务器答应进行tcp 连接(第二次握手)
3.浏览器确认,并发送get 请求头和数据(第三次握手,这个报文比较小,所以http 会在此时
进行第一次数据发送)
4.服务器返回200 OK 响应 - cookie 和session 的区别?
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的cookie 并进行cookie 欺骗考虑到安全应当使
用session。3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服
务器性能方面,应当使用cookie。
4、单个cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20 个cookie。
5、建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在cookie 中 -
HTTP 协议状态码有什么用,列出你知道的HTTP 协议的状态码,然后讲出他们都
表示什么意思?通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。
常见的状态机器码有:
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 给服务端,答应关闭服务端的通信(连接)请求 - 说一下什么是tcp 的2MSL?
主动发送fin 关闭的一方,在4 次挥手最后一次要等待一段时间我们称这段时间为2MSL
TIME_WAIT 状态的存在有两个理由:
1.让4 次挥手关闭流程更加可靠
2.防止丢包后对后续新建的正常连接的传输造成破坏 - 为什么客户端在TIME-WAIT 状态必须等待2MSL 的时间?
1、为了保证客户端发送的最后一个ACK 报文段能够达到服务器。这个ACK 报文段可能丢失,
因而使处在LAST-ACK 状态的服务器收不到确认。服务器会超时重传FIN+ACK 报文段,客户端就
能在2MSL 时间内收到这个重传的FIN+ACK 报文段,接着客户端重传一次确认,重启计时器。最
好,客户端和服务器都正常进入到CLOSED 状态。如果客户端在TIME-WAIT 状态不等待一段时间,
而是再发送完ACK 报文后立即释放连接,那么就无法收到服务器重传的FIN+ACK 报文段,因而也
不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入CLOSED 状态。
2、防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK 确认报文段
后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样
就可以使下一个新的连接中不会出现这种旧的连接请求报文段。 - 说说HTTP 和HTTPS 区别?
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的请求方式?
根据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 回显服务器收到的请求,主要用于测试或诊断。
- 使用Socket 套接字需要传入哪些参数?
Address Family 和Type,分别表示套接字应用场景和类型。
family 的值可以是AF_UNIX(Unix 域,用于同一台机器上的进程间通讯),也可以是AF_INET
(对于IPV4 协议的TCP 和UDP),至于type 参数,SOCK_STREAM(流套接字)或者
SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw 套接字)。 - HTTP 常见请求头?
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 异步请求)
- osi七层模型?IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?
IP: 网络层
七层模型:应用层,表示层,会话层,传输层,网络层,网络层,数据链路层,物理层
TCP/UDP: 传输层
HTTP、RTSP、FTP: 应用层协议 - url的形式?
形式: 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