python面试题——网络编程和并发
1、简述 OSI 七层协议。
物理层(电信号、比特流) 基于电器特性发送高低电压(电信号) RJ45、IEEE802.3 数据链路层(数据帧) 定义了电信号的分组方式,分组方式后来形成了统一的标准,即以太网协议ethernet ppp(点对点)、VLAN(虚拟局域网)、MAC地址 网络层(数据包) 引入网络地址区分不同广播域 IP ARP RARP、ICMP、 RIP OSPF IGRP 传输层(数据段) 建立端口到端口的通信 TCP、UDP、SSL(安全套接层)、TLS 会话层 (会话协议数据单元) 表示层 (表示协议数据单元) 应用层 (应用协议数据单元) 规定应用程序的数据格式 FTP(文件传输协议)、DNS(域名解析协议)、HTTP(超文本传输协议)、SMTP(简单邮件传输协议)、Telnet远程登陆协议
2、什么是C/S和B/S架构?
C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。 B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助谷歌,火狐等浏览器来运行。 WEB应用程序一般是B/S模式。 Web应用程序首先是“应用程序”,和用标准的程序语言,如java,python等编写出来的程序没有什么本质上的不同。 在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端。
3、简述三次握手、四次挥手的流程。
三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。 1、Client端发送连接请求报文 2、Server端接受连接后回复ACK报文,并为这次连接分配资源。 3、Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。 TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作(中断连接),在socket编程中,任何一方执行close()操作即可产生挥手操作。 挥手过程: 1、假设Client端发起中断连接请求,也就是发送FIN报文。 2、Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。
所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。 3、当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。 4、Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,
如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。
4、什么是arp协议?
arp协议功能:广播的方式发送数据包,获取目标主机的mac地址。 在以太网环境,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为目的主机48位以太网的地址(MAC地址)。这就需要在互联层有一个服务或功能将IP地址转换为相应的物理地址(MAC地址),这个服务或者功能就是ARP协议。 所谓的“地址解析”,就是主机在发送帧之前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MA地址,以保证主机间相互通信的顺利进行。 工作原理: 1、arp列表,每个主机,arp缓冲区,arp列表。存放ip地址与mac地址对应关系 2、寻找目的主机ip对应的mac地址 (1) 源主机发送数据, arp列表寻找目的ip所对应的mac地址,有,发送data (2) 没有,向本网段,所有主机(广播),发送arp数据包,内容:源主机ip+源主机mac+目的主机ip 3、arp响应包,本网络所有主机受到arp数据包 (1)不是自己ip,忽略该包 (2)是,取出源主机的ip+mac,写入自己的arp列表,存在,覆盖 (3)arp响应包。写入自己的mac地址 4、收到arp响应包。目的主机ip+mac写入自己arp列表,发送data。收不到arp响应包,arp查询失败.
5、TCP和UDP的区别?
TCP 传输控制协议, UDP用户数据报文协议 区别: (1) TCP面向连接(tcp3次连接),可靠的(确认包) UDP非面向连接(无),不可靠的(无) (2) TCP流模式协议(缓冲池,recv(1024)),面向字节流。 UDP数据报模式协议(1个报文1个报文的),面向报文的。 (3) TCP注重数据安全,速度一般 UDP注重数据传输速度,安全性一般 (4) TCP保证数据正确性,保证数据顺序 UDP不保证数据正确性,不保证数据顺序 对比: TCP协议虽然安全性很高,但是网络开销大,而UDP协议虽然没有提供安全机制,但是网络开销小,在现在这个网络安全已经相对较高的情况下,为了保证传输的速率,我们一般还是会优先考虑UDP协议!
6、什么是局域网和广域网?
网络按范围分为:局域网,城域网,广域网三种 局域网:(Local Area Network,LAN), 局域网是一个局部范围的计算计组,比如家庭网络就是一个小型的局域网,里面包含电脑、手机和平板等,
他们共同连接到你家的路由器上。又比如学校的机房就是一个局域网,里面有几百几千台电脑,当机房无法上外网时,但是电脑之间仍可以通信,
你们可以通过这个局域网来打CS 、玩红警。理论上,局域网是封闭的,并不可以上外网,可以只有两台电脑,也可以有上万台。 广域网:(WAN,Wide Area Network),广域网的范围就比较大了,可以把你家和别人家、各个省、各个国家连接起来相互通信。
广域网和局域网都是从范围的角度来划分的,广域网也可以看成是很多个局域网通过路由器等相互连接起来。
7、为何基于tcp协议的通信比基于udp协议的通信更可靠?
TCP可靠的缘故:只要不得到确认,就重新发送数据报,直到得到对方的确认为止。 UDP协议是尽最大努力交付,无法保证数据准确交付到目标主机,也不需要对接收到的UDP报文进行确认。
8、什么是socket?简述基于tcp协议的套接字通信流程。
答:Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 服务端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。这时客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务端的连接就建立了。客户端发送数据请求,服务端接收请求并处理请求,然后把回应数据发给客户端,客户端读取数据,最后关闭数据,一次交互结束。 服务端:socket(),bind(),listen(),accept(),recv(),send(),close() 客户端:socket(),connect(),send(),recv(),close()
9、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
答:TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 所谓粘包问题原因: (1)主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。 (2)发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一个TCP段。
若连续几次需要send的数据都很少,通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去,这样接收方就收到了粘包数据。 发生粘包的情况: (1)发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包) (2)接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
10、IO多路复用的作用?
多路复用IO模型也有人称为IO多路复用,还有人称为事件驱动IO(event driven IO)。 它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。 优点:相比其他模型,使用select() 的事件驱动模型只用单线程(进程)执行,占用资源少,不消耗太多 CPU,同时能够为多客户端提供服务。
如果试图建立一个简单的事件驱动的服务器程序,这个模型有一定的参考价值。
11、什么是防火墙以及作用?
防火墙系统是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合。
它可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。
在逻辑上,它是一个分离器,一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动,保证了内部网络的安全。
12、select、poll、epoll 模型的区别?
select的缺点: (1)单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差; (2)内核/用户空间内存拷贝问题,select需要复制大量的句柄数据结构,产生巨大的开销 (3)select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件; (4)select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO,那么之后再次select调用还是会将这些文件描述符通知进程。 poll的优劣: 相比于select模型,poll使用链表保存文件描述符,因此没有了监视文件数量的限制,但其他三个缺点依然存在。 epoll: epoll的实现机制与select/poll机制完全不同,上面所说的select的缺点在epoll上不复存在。 epoll的设计和实现select完全不同。epoll通过在linux内核中申请一个简易的文件系统(文件系统一般用什么数据结构实现?B+树)。把原先的select/poll调用分成了3个部分: 1)调用epoll_create()建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源) 2)调用epoll_ctl向epoll对象中添加这100万个连接的套接字 3)调用epoll_wait收集发生的事件的连接 如此一来,要实现上面说的场景,只需要在进程启动时建立一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。
13、简述 进程、线程、协程的区别 以及应用场景?
进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。 多线程(即多个控制线程)的概念是,在一个进程中存在多个线程,多个线程共享该进程的地址空间。 线程与进程的区别: 1、每启动一个进程,进程内都至少有一个线程。 2、进程本身只是一个资源单位,并不能真正执行,进程内开的线程才是真正的运行单位。 3、一个进程内可以启动多个线程,同一进程内线程间共享资源。 4、启线程的开销远远小于开进程。 5、线程可以相当程度控制相同进程下的线程,进程只能控制其子进程。 6、对主线程的更改(取消、优先级更改等)可能会进程的其他线程的行为;对父进程的修改则不会影响子进程。 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。 协程与线程区别: 1、必须在只有一个单线程里实现并发 2、线程进程都是同步机制,而协程则是异步 3、修改共享数据不需加锁(本质是一个一个执行,因此不需要考虑加锁) 4、协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态(自己控制切换)
14、GIL锁是什么鬼?
GIL(Global Interpreter Lock) 全局解释器锁 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。 GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理
15、Python中如何使用线程池和进程池?
必须对服务端开启的进程数或线程数加以控制,让机器在一个自己可以承受的范围内运行,这就是进程池或线程池的用途。 from concurrent.futures import ThreadPoolExecutor import time import random def la(name): print("%s is laing" % name) time.sleep(random.randint(3,5)) res = random.randint(7, 13)*'#' return {'name':name, 'res':res} # weigh({'name':name, 'res':res}) # 直接把字典传给称重weigh(),造成了程序耦合 def weigh(shit): shit = shit.result() # 对象.result()拿到结果并赋值给shit name = shit['name'] size = len(shit['res']) print('%s 拉了 《%s》kg' % (name, size)) if __name__ == '__main__': pool = ThreadPoolExecutor(13) # 回调函数,前面任务执行完,return返回值就会自动触发weith功能执行,把pool.submit(la, 'alex')对象当做参数传给weigh() pool.submit(la, 'alex').add_done_callback(weigh) pool.submit(la, 'wupeiqi').add_done_callback(weigh) pool.submit(la, "yuanhao").add_done_callback(weigh) """ alex is laing wupeiqi is laing yuanhao is laing alex 拉了 《10》kg wupeiqi 拉了 《7》kg yuanhao 拉了 《7》kg """
16、threading.local的作用?
Python提供了 threading.local 类,将这个类实例化得到一个全局对象, 但是不同的线程使用这个对象存储的数据其它线程不可见(本质上就是不同的线程使用这个对象时为其创建一个独立的字典)。
17、进程之间如何进行通信?
进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。 from multiprocessing import Queue 创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递 基于管道实现进程间通信(与队列的方式是类似的,队列就是管道加锁实现的)
18、什么是并发和并行?
并发是指一个处理器同时处理多个任务,看起来多个进程像在同时运行 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
19、进程锁和线程锁的作用?
进程之间数据不共享,但是共享同一套文件系统,进程锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,
即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全 线程锁通常被用来实现对共享资源的同步访问。为每一个共享资源创建一个Lock对象,当你需要访问该资源时,
调用acquire方法来获取锁对象(如果其它线程已经获得了该锁,则当前线程需等待其被释放),
待资源访问完后,再调用release方法释放锁。
20、解释什么是异步非阻塞?
非阻塞IO: 非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。 非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好, 此时会返回一个error。 进程在返回之后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform系统调用。 这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程, 进行数据处理。 需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。 异步IO: 用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后, 首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存, 当这一切都完成之后(wait data和copy data都完成后),kernel会给用户进程发送一个signal,告诉它read操作完成了。 区别: 在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,
也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。
而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。
在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。
21、路由器和交换机的区别?
1、工作层次不同 最初的交换机工作在OSI模型中的数据链路层,工作原理简单 路由器工作在OSI模型中的网络层,得更多协议信息,做更智能的转发决策 2、数据转发所依据的对象不同 交换机是利用物理地址(MAC地址),确定转发的目的地址。(MAC固化硬件,一般不可更改) 路由器是利用IP地址,确定转发的目的地址。(IP通常为网关或系统自动分配的) 3、是否可以分割广播域 传统的交换机可以分割冲突域,不能分割广播域,而路由器可以分割广播域 由交换机连接的网段仍然属于同一广播域,广播数据报会在交换机连接的所有网段上传播,某些情况导致通信拥挤和安全漏洞。连接到路由器上的网段被分配成不同的广播域,所以,广播数据不穿过路由器 虽然三层交换机可以分割广播域,但是子广播域之间不能通信,还是需要路由器 4、路由器提供了防火墙的服务 路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包,不传送未知目标网络数据包,从而可以防止广播风暴 5、表 二层交换机上存在MAC表,三层交换机上存在路由表、MAC表、ARP表,路由器上存在路由表和ARP表。 总之,交换机在具体的城域网中扮演着VLAN透传的角色,就是桥。路由器的每一个端口都是一个独立的广播域和冲突域,而交换机是只有一个广播域和端口数量的冲突域。
22、什么是域名解析?
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,
为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。 域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,
是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。
23、如何修改本地hosts文件?
24、生产者消费者模型应用场景及优势?
生产者指的是生产数据的任务,消费者指的是处理数据的任务。 并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 引入生产者消费者模型为了解决的问题是: (1)平衡生产者与消费者之间的工作能力,从而提高程序整体处理数据的速度。 (2)生产者消费者模型实现类程序的解耦合。 模式的应用场景:处理数据比较消耗时间,线程独占,生产数据不需要即时的反馈等。
25、什么是cdn?
内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上、由分布在不同区域的边缘节点服务器群组成的分布式网络。
替代传统以Web Server为中心的数据传输模式,将源站资源缓存到阿里云全国各地的边缘服务器,供用户就近快速获取,提升用户体验,降低源站压力。
26、LVS是什么及作用?
Linux服务器集群系统--LVS(Linux Virtual Server) 其实是一种集群(Cluster)技术,采用IP负载均衡技术(LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的,
linux内核2.6版本以上是默认安装IPVS的)和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,
且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。 LVS负载均衡调度技术是在LINUX内核中实现的,因此被称之为LINUX虚拟服务器。我们使用该软件配置LVS时候,不能直接配置内核中的IPVS,
而需要使用IPVS的管理工具ipvsadm进行管理,当然我们也可以通过keepalived软件直接管理IPVS,并不是通过ipvsadm来管理ipvs。
27、Nginx是什么及作用?
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,
也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
28、keepalived是什么及作用?
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。 作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,
同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,
不需要人工干涉,需要人工做的只是修复故障的服务器。
29、haproxy是什么以及作用?
HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件。 HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。 在功能上,能以proxy反向代理方式实现WEB均衡负载 HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,
完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
30、什么是负载均衡?
用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、
最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。
负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,
用于解决互联网架构中的高并发和高可用的问题。
31、什么是rpc及应用场景?
远程过程调用(英语:Remote Procedure Call,縮寫為RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用 远程过程调用时一个分布式计算的客户端-服务器的例子,远程过程调用总是由客户端向服务器发出一个执行若干过程请求,并用客户端提供的参数。执行结果将返回客户端。 为了允许不同的客户端均能访问服务器,许多标准化的 RPC 系统应运而生了。其中大部分采用接口描述语言(Interface Description Language,IDL),方便跨平台的远程过程调用。
32、简述 asynio模块的作用和应用场景。
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。 asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。
33、简述 gevent模块的作用和应用场景。
Gevent是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,
在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。
Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
34、twisted框架的使用和应用?
https://www.ibm.com/developerworks/cn/linux/network/l-twist/part1/ Twisted是用Python实现的基于事件驱动的网络引擎框架。 Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。 就像Python一样,Twisted也具有“内置电池”(batteries-included)的特点。 Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。
35、什么是死锁,如何解决?
多个进程在运行过程中----抢夺资源而造成的一种僵局 如果没有外力推进-----处于僵局中的进程无法继续进行 导致死锁的4个必要条件: 互斥。一次------只有一个进程----可以使用一个资源 不可抢占。不能抢占---进程已经占有的资源 循环等待。存在封闭的进程链---每个进程----此链中---下一个进程需要的资源 占有且等待。一个进程等待其他进程---继续占有----已经分配到的资源 死锁处理:预防、避免、检测、解除死锁
36、谈谈你对http协议的认识。
http协议是基于socket使用tcp协议进行传输数据的。 原来学习django框架,从socket服务端开始学起。自己创造了一个socket服务器来充当网站,浏览器当socket客户端。 短连接:一次请求和一次响应然后断开连接;
无状态:由于短连接的特性所引起的现象。
数据格式: 请求:
请求头:
请求体:
"GET /index http1.1.\r\nhost:www.baidu.com\r\ncontent-type:json\r\n"
"POST /index http1.1.\r\nhost:www.baidu.com\r\ncontent-type:json\r\n\r\nname=alex&age=18"
响应:
响应头:
响应体:页面显示的内容就是响应体。
"Location:xxxx\r\n\r\n响应体"
37、常见的请求头和请求体?
请求头: host content-type user-agent cookies referer(上一次请求的地址,可用于做防盗链) 常见请求方法: GET/POST/DELETE/PUT/PATCH/OPTIONS
38、