python网络篇
TCP、UDP
TCP面向连接(如打电话要先拨号连接),UDP是无连接的,即发送数据前不需要建立连接;
TCP提供可靠的服务。TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;
TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有阻塞控制,因此网络出现阻塞不会使原主机的发送速率降低(对事实应用很有用,如IP电话,实时视频会议等);
每一条TCP连接只能是点到点的,UDP支持一对一,一对多,多对一和多对多的交互通信;
TCP首部开销20字节,UDP的首部开销小,只有8个字节;
TCP的逻辑通信信道是全双工可靠信道,UDP则是不可靠信道;
POST、GET
GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输;
POST请求,把请求的数据放置在HTTP请求包的包体上。上面的item=bandsaw就是实际的传输数据;
在HTTP规范中,没有对URL的茶u你孤独和传输的数据大小进行限制,但在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此在使用GET请求时,传输数据会受到URL长度的限制。对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面体东的安全仅仅是不修改服务器的数据。比如GET请求,用户名和密码会暴露在URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史纪录的原因,此时的用户名和密码就很容易被他人拿到。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击。
cookie、session
cookie数据存放在客户的浏览器上,session数据放在服务器上。
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session;
session会在一定时间内保存在服务器上,当访问增多,会占用服务器的性能,考虑到减轻服务器性能方面,应当使用cookie;
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie;
建议:将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie。
三次握手,四次挥手,2msl
图片1.png2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态;
当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没有收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可再发一个ACK应答包;
在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用;
当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在世纪应用中可以通过设置SO_REUSEASSR选项达到不必等待2MSL时间结束再使用此端口。
僵尸进程、孤儿进程
孤儿进程,父进程退出,子进程还在运行的进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对他们完成状态收集工作。
僵尸进程,进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程。
避免僵尸进程方法:fork两次用孙子进程去完成子进程的任务;用wait()函数使父进程阻塞;使用信号量,在signal handler中调用waitpid,这样父进程不用阻塞。
长链接、短链接
短链接,连接→传输数据→关闭连接,HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束后就中断连接。短链接是指SOCKET连接后发送后接收完数据马上断开连接。
长链接,连接→传输数据→保持连接→传输数据→...→关闭连接,长链接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
HTTP状态码
告诉用户操作所处状态
200:服务器成功处理了请求
301、302 Moved Permanently(重定向)请求的URL已移走。Response中应该包含一个Location URL,说明资源现在所处的位置;
304 Not Modidied(未修改)客户缓存的资源是最新的,要客户端使用缓存;
404 Not Found(未找到资源);
501 Internal Server Error 服务器遇到一个错误,使其无法对请求提供服务;
死锁
原因:竞争资源、程序推进顺序不当;
必要条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件;
处理死锁基本方法:
预防(摒弃条件)、避免(银行家算法)、检测(资源分布图)、解除(剥夺死锁、撤销进程)。
浏览网页中间过程
- 解析域名,找到IP
浏览器会缓存DNS一段时间,一般2-30分钟不等,如果有缓存,直接返回IP,否则下一步。
缓存中无法找到IP,浏览器会进行一个系统调用,查询hosts文件。如果找到,直接返回IP,否则下一步。
本地查询无果,智能借助于网络,路由器一般都会有自己的DNS缓存,ISP服务商DNS缓存,这时一般都能够得到相应的IP,如果还是无果,只能借助于DNS递归解析了。
这时ISP的DNS服务器就会开始从根域名服务器开始递归搜索,从.com顶级域名服务器,到欲访问的域名服务器。
到这里,浏览器就获得网络IP,在DNS解析过程中,常常解析出不同的IP。
- 浏览器于网站上建立TCP连接
浏览器利用IP直接网站主机通信,浏览器发出TCP连接请求,主机返回TCP应答保温,浏览器受到应答报文发现ACK标志位为1,表示连接请求确认,浏览器返回TCP确认保温,主机收到确认保温,三次握手,TCP连接建立完成。
- 浏览器发起默认的GET请求
浏览器向主机发起一个HTTP-GET方法报文请求,请求中包含访问的URL,也就是http://xxxxx/还有User-Agent用户浏览器操作系统信息,编码等,值得一提的是Accep-Encoding和cookies。Accept-Encoding一般采用gzip,压缩之后传输HTML文件,cookies如果是首次访问,会提示服务器保存用户缓存信息,如果不是,可利用cookies对应键值,找到对应缓存,缓存里面存放用户名,密码和一些用户设置项。
- 显示页面或返回其他
返回状态码200 OK,表示服务器可以响应请求,返回报文,由于在报文中Content-type为text/html,浏览器以HTML形式呈现,而不是下载文件。但是对于大型网站存在多个主机站点,往往不会直接返回请求页面,而是重定向。返回的中Aug你太吗就不是200,而是301,302。浏览器获得重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新第一步访问即可。