面试题--网络编程

UDP总结

  1. 创建客户端套接字socket
  2. 发送/接收数据
  3. 关闭套接字socket
  4. 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()
  5. 编码的转换
    str--->bytes:  encode编码
    bytes--->str;  decode编码
  6. 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总结

  1. 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()
  2. TCP服务器的船舰流程

    1.创建TCP 服务端的socket
    2.bing 绑定ip 地址和端口号
    3.listen 使套接字变为被动套接字
    4.accept 取出一个客户端连接,用于服务
    5.recv/send 接收和发送消息
    6.关闭套接字

    1.import socket
    23.def main():
    4. # 1、创建tcp 服务端的socket
    5. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    67. # 2、绑定
    8. server_socket.bind(('', 8888))
    910. # 3、listen 使套接字变为被动套接字
    11. server_socket.listen(128)
    1213. # 4、如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
    14. # client_socket 用来为这个客户端服务
    15. # tcp_server_socket 就可以省下来专门等待其他新客户端的链接
    16. client_socket, client_addr = server_socket.accept()
    1718. # 5、接收客户端发来的消息
    19. recv_data = client_socket.recv(1024)
    20. print("接收到客户端%s 的数据:%s" % (str(client_addr), recv_data.decode('gbk')))
    2122. # 6、回复数据给客户端
    23. client_socket.send("收到消息".encode('gbk'))
    2425. # 7、关闭套接字
    26. client_socket.close()
    27. server_socket.close()
    2829.if __name__ == '__main__':
    30. main()
     当客户端需要链接服务器时,就需要使用connect 进行链接,udp 是不需要链接的而是直接发
    送,但是tcp 必须先链接,只有链接成功才能通信
     当一个tcp 客户端连接服务器时,服务器端会有1 个新的套接字,这个套接字用来标记这个客户
    端,单独为这个客户端服务
     listen 后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept 返回的新套接
    字是标识这个新客户端的
     关闭listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之
    前已经链接成功的客户端正常通信。
     关闭accept 返回的套接字意味着这个客户端已经服务完毕
     当客户端的套接字调用close 后,服务器端会recv 解阻塞,并且返回的长度为0,因此服务器可
    以通过返回数据的长度来区别客户端是否已经下线;同理当服务器断开tcp 连接的时候客户端
    同样也会收到0 字节数据。

总结

  1. 怎么实现强行关闭客户端和服务器之间的连接?

    在socket 通信过程中不断循环检测一个全局变量(开关标记变量),一旦标记变量变为关闭,则调
    用socket 的close 方法,循环结束,从而达到关闭连接的目的。

  2. 简述TCP 和UDP 的区别以及优缺点?

    UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。
    优点:UDP 速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送
    缺点:UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数
    据是否会正确接收,也不重复发送,不可靠。

    TCP 是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
    优点:TCP 在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。
    缺点:TCP 相对于UDP 速度慢一点,要求系统资源较多。

  3. 简述浏览器通过WSGI 请求动态资源的过程?

    1.发送http 请求动态资源给web 服务器
    2.web 服务器收到请求后通过WSGI 调用一个属性给应用程序框架
    3.应用程序框架通过引用WSGI 调用web 服务器的方法,设置返回的状态和头信息。
    4.调用后返回,此时web 服务器保存了刚刚设置的信息
    5.应用程序框架查询数据库,生成动态页面的body 的信息
    6.把生成的body 信息返回给web 服务器
    7.web 服务器吧数据返回给浏览器

  4. 描述用浏览器访问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 次挥手结束,完成整个访问过程

  5. 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 响应

  6. cookie 和session 的区别?

    1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
    2、cookie 不是很安全,别人可以分析存放在本地的cookie 并进行cookie 欺骗考虑到安全应当使
    用session。

    3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服
    务器性能方面,应当使用cookie。
    4、单个cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20 个cookie。
    5、建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在cookie 中

  7. HTTP 协议状态码有什么用,列出你知道的HTTP 协议的状态码,然后讲出他们都
    表示什么意思?

    通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。
    常见的状态机器码有:
    100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
    200-299:表示服务器成功接收请求并已完成处理过程,常用200(OK 请求成功)。
    300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的url)。
    304、307(使用缓存资源)。
    400-499:客户端请求有错误,常用404(服务器无法找到被请求页面),403(服务器拒绝访问,
    权限不够)。
    500-599:服务器端出现错误,常用500(请求未完成,服务器遇到不可预知的情况)。

  8. 请简单说一下三次握手和四次挥手?

    三次握手过程:
    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 给服务端,答应关闭服务端的通信(连接)请求

  9. 说一下什么是tcp 的2MSL?

    主动发送fin 关闭的一方,在4 次挥手最后一次要等待一段时间我们称这段时间为2MSL
    TIME_WAIT 状态的存在有两个理由:
    1.让4 次挥手关闭流程更加可靠
    2.防止丢包后对后续新建的正常连接的传输造成破坏

  10. 为什么客户端在TIME-WAIT 状态必须等待2MSL 的时间?

    1、为了保证客户端发送的最后一个ACK 报文段能够达到服务器。这个ACK 报文段可能丢失,
    因而使处在LAST-ACK 状态的服务器收不到确认。服务器会超时重传FIN+ACK 报文段,客户端就
    能在2MSL 时间内收到这个重传的FIN+ACK 报文段,接着客户端重传一次确认,重启计时器。最
    好,客户端和服务器都正常进入到CLOSED 状态。如果客户端在TIME-WAIT 状态不等待一段时间,
    而是再发送完ACK 报文后立即释放连接,那么就无法收到服务器重传的FIN+ACK 报文段,因而也
    不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入CLOSED 状态。
    2、防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK 确认报文段
    后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样
    就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

  11. 说说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 协议安全。

  12. 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 回显服务器收到的请求,主要用于测试或诊断。
  13. 使用Socket 套接字需要传入哪些参数?

    Address Family 和Type,分别表示套接字应用场景和类型。
    family 的值可以是AF_UNIX(Unix 域,用于同一台机器上的进程间通讯),也可以是AF_INET
    (对于IPV4 协议的TCP 和UDP),至于type 参数,SOCK_STREAM(流套接字)或者
    SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw 套接字)。

  14. 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 异步请求)
  15. osi七层模型?IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?

    IP: 网络层
    TCP/UDP: 传输层
    HTTP、RTSP、FTP: 应用层协议

    七层模型:应用层,表示层,会话层,传输层,网络层,网络层,数据链路层,物理层

  16. 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

猜你喜欢

转载自www.cnblogs.com/yang950718/p/10794019.html