Python Web学习笔记之面试TCP的15个问题
答案:不能!举反例,进程B所在机器的TCP收到进程A发送的“hello”信息后,告诉进程A发送成功,但有可能没有立即将数据交给进程B,而是放在自己的缓冲区中,等待进程B读取,如果机器此时突然掉电,缓冲区中的信息将丢失,进程B将不可能收到“hello”字符串。
2、有什么办法来尽量避免上述情况的发生呢?
答案:将TCP报文段首部中的PSH标志置1,这样会让B端的TCP协议收到数据后尽快交给进程B,能不缓存尽量不要缓存。
3、我们知道通常TCP连接的建立需要3次握手,关闭需要4次握手,为什么关闭会多一次呢?
答案:简单说,就是TCP允许半关闭状态的存在。当进程A向进程B发送FIN,B也向A发送确认后。此时此刻的状态就是半关闭状态,A发送的FIN就是告诉B:“我要发送的数据都发送完了”但B没有发送FIN给A,有可能代表B还有没发送完的数据,如果B也发送完数据了,B就发送FIN给进程A,进程A确认B发送的FIN,这时,双方都已经发送完了数据,连接就断开了,TCP回收相关资源。
4、假如服务器突然掉电重启,但客户端并不知情,请问此时二者之间的TCP连接处于什么状态?
答案:处于半打开状态。就是客户端还觉得连接是正常的,服务器这边已经没有连接的任何信息了。
5、那么,假如此时客户端通过这个连接向服务器请求数据,服务器会怎么应对呢?
答案:服务器收到客户端的请求会进行一次ARP查询,获得客户端MAC地址,然而由于已经丢失了所有连接信息,此时的服务器是一脸懵逼(就像喝了孟婆汤!),于是乎,它会发一个RST给客户端,表示:“哥们,我不认识你,想跟我说话请先发送SYN!”
6、假如客户端按照服务器的要求重新建立连接,却搞错了服务器的端口号,会发生什么情况呢?
答案:有两种可能,一种是服务器端的TCP收到客户端请求,查看本机上是否有进程在监听相应的端口,如果有,就把请求交给这个进程,一般而言,这个进程不会接受这个连接的,于是它会发一个RST给客户端。还有一种可能是TCP没有找到哪个进程在监听相应的端口,于是TCP就会直接发一个RST给客户端,一般而言都会是这种情况。
7、假如现在有一个多进程服务器,服务器进程为A,接受一个连接后新建一个进程B来处理连接,再接受一个连接后又建一个进程C来处理这个连接,请问,进程ABC是否监听同样的端口?
答案:是!
8、那TCP接收到发送给这个端口的报文段,怎么决定发给哪个进程呢?
答案:首先,所有的SYN报文段都会发送给服务器进程A,其他的报文段依据<sourceIP:port,targetIP:port>这个四元组来决定发送给进程B还是进程C。
9、假如上面的服务器进程A收到一个连接请求,正在为这个请求创建处理进程的时候,又有新的连接请求进来了,TCP会怎么处理呢?
答案:一般情况下,服务器进程A会给TCP一个指示,让TCP维护一个适当长度的连接队列,TCP与新连接请求完成三次握手后,就会把这个连接放入连接队列中,服务器进程A会在合适的时候来从这个队列中取连接。
10、这个连接对列是否会对服务器的并发处理能力产生影响呢?如果会,会有什么影响?
答案:不会!二者没有必然关系。
11、MSS和MTU各是什么,二者是什么关系?
答案:MSS是TCP最大报文段长度,就是TCP发送数据需要对数据分段时,最大的段的字节数。MTU是最大传输单元,通常由网卡的硬件特性规定,表示通过该网卡传输的数据单元最大的字节数。MSS要受同一台机器上的MTU限制。比如MTU为1500字节,那么MSS就只能是1460字节,这是因为1460字节的数据在通过网卡向外传输时,会加上20字节的ip头和20字节的tcp头。
12、假设机器A和B的MSS分别是1400和1600,请问,A通过TCP向B发送数据时,是否可以发送长度为1600字节的数据段?
答案:不可以,虽然发送1600字节的数据段没有突破B的MSS,但是突破了A自己的MSS。这样一来,当这1600字节的数据段通过A的网卡向B发送时,会被切分为2个IP片,每个为840字节,以保证不突破A的MTU,这显然降低了传输的效率,因为两个840字节中有着相同的IP头和TCP头。
13、机器A和B有一条TCP连接,假如A想尽快断开连接,应当怎么办?
答案:A可以直接给B发送一个RST,就可以了,相当于告诉B,我关闭连接了,你看着办吧。这叫做异常关闭。
14、B的TCP收到A发来的RST,会怎么办?
答案:B的TCP会告诉上层的进程,连接已经断开了,然后就会回收这条连接的资源,并不会发送任何确认信息给A。所谓你无情休怪我不义。
15、假设A正常断开与B的TCP连接,当收到B的FIN时,A发送ACK给B,是否就算完成了4次握手,连接已经成功断开?
答案:不是,A的TCP会启动一个定时器,等待2MSL的时间,这主要是为了防止A的ACK没有成功传到B,让B以为自己的FIN没有送到A处,反复重传FIN的问题。2MSL的时间到时,如果A没有再次收到B的FIN,说明B成功收到A的ACK,A就可以安全地断开这个连接,若期间再次收到B的FIN,则A会重传ACK。
链接:https://www.zhihu.com/question/28943943/answer/155660761
Python Web学习笔记之面试TCP的15个问题的更多相关文章
- Python Web学习笔记之图解TCP/IP协议和浅析算法
本文通过两个图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图1所示,给出了TCP通信过程的示意图. 图1主要包括三部分:建立连接.传 ...
- Python Web学习笔记之TCP/IP、Http、Socket的区别
经常在笔试.面试或者工作的时候听到这些协议,虽然以前没怎么涉及过,但至少知道这些是和网络编程密不可分的知识,作为一个客户端开发程序员,如果可以懂得网络编程的话,他的作用和能力肯定会提升一个档次.原因很 ...
- Python Web学习笔记之TCP/IP协议原理与介绍
HTTP.FTP.SMTP.Telnet等等协议,哦!那个HTTP协议啊就是访问网页用的那个协议啊然后那个······其实······你懂得,我们应该从实际来了解他,理解网络协议的作用与功能,然后再从 ...
- Python Web学习笔记之TCP的3次握手与4次挥手过程
前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一个服 ...
- Python Web学习笔记之TCP、UDP、ICMP、IGMP的解释和区别
TCP与UDP解释 TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供超时重发,丢弃重复数据, ...
- Python Web学习笔记之WebSocket原理说明
众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应用可以良好支撑,但对于实时要 ...
- Python Web学习笔记之并发编程IO模型
了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...
- Python Web学习笔记之多线程编程
本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...
- Python Web学习笔记之socket编程
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
随机推荐
- The end of the world
这首63年乡村及流行排行榜双料亚军的歌曲,(Cashbox 年终冠军)据说原是作者为怀念亡父写就,虽是流行曲风,但由Skeeter Davis演唱,却赋予其不同的生命,在键盘连绵的三连音中,少女诉说着 ...
- HOJ 2133&POJ 2964 Tourist(动态规划)
Tourist Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1503 Accepted: 617 Description A ...
- 字符串-回文-Manacher算法
http://blog.csdn.net/zzkksunboy/article/details/72600679 https://segmentfault.com/a/1190000008484167 ...
- 专访msup创始人兼CEO刘付强:追求卓越是数据时代下企业和个人的生存之道
近些年,"信息化带动工业化"策略的深入人心,这为信息技术本身开辟了一个更加广阔的应用天地,在这样的大环境下国内IT培训市场得了飞速发展.那么在云计算.大数据时代,如何让企业的IT团 ...
- ASP.NET MVC中ViewBag和ViewData的区别
在MVC3.0以上我们会用到ViewBag或者ViewData进行页面传值,对比一下二者的差距: ViewData ViewBag 基于key/value的字典集合 dynamic类型对象 从ASP. ...
- Python面向对象:类、实例与访问限制
首先记录下面向对象的名词: 对象:python万物皆对象,程序设计的东西在对象上体现. 类:具有相同属性和行为的对象的集合. 消息:各个对象之间通过消息相互联系. 方法:对象功能实现的过程. 封装:把 ...
- mysql 数据表操作 存储引擎介绍
一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...
- spring 装配集合
1:创建pojo,属性包含集合,集合元素为基本类型 package com.liyafei.pojo; import java.util.List; import java.util.Map; imp ...
- latex 转word
1:下载pandoc软件,支持多种文件格式互转. http://www.pandoc.org/installing.html#windows 2:下载zip包,解压,并将含有pandoc.exe的目录 ...
- Spark中的Spark Shuffle详解
Shuffle简介 Shuffle描述着数据从map task输出到reduce task输入的这段过程.shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过s ...