微信号:java_bj

介绍:从算法基础到常用框架的知识体系,从初级程序员到高级架构师的成长之路,从创业小团队到Google、BAT的工作机会,始于JAVA而又不止于JAVA.JAVAer在北京,我们一起成长.

关于TCP/IP必须知道的几个基础问题

2016-12-18 22:43 子文歇

点击上方“Java北京”关注我们


描述一下TCP三次握手的过程

接下来我们根据下面这幅图来解释一下TCP三次握手。p.s: 每个箭头代表一次握手。


第一次握手

client(客户端)发送一个SYN(seq=x)包给server(服务器),然后“期待”server的ACK回复。p.s: seq为sequence(序列)的缩写,ACK为acknowledge(通知)的缩写。

第二次握手

  1. server(服务器)接收到SYN(seq=x)包后就返回一个ACK(ack=x+1)包,意思是告诉client(客户端):我已经成功接收到你的SYN包。

  2. 并且自己也发送一个SYN(seq=y)包,然后”期待“client(客户端)的ACK回复。

第三次握手

  1. client(客户端)接收到server(服务器)发回的ACK(ack=x+1)包后,然后就把自己的状态设置为ESTABLISHED(已建立连接)。

  2. 然后根据server(服务端)发来的SYN(seq=y)包,返回给”期待"中的server一个ACK(ack=y+1)包。期待中的server收到ACK回复,也把自己的状态设置为ESTABLISHED(已建立连接)。到此TCP三次握手完成,client与server可以正常进行通信了。


分析一下TCP四次挥手的整个过程


以上面这张图为例,我们来分析一下TCP四次挥手的过程。

第一次挥手

client(客户端)发送一个FIN(seq=x+2&&ack=y+1)包,此时client进入FIN_WAIT_1状态,这表明client已经没有数据要发送了。

第二次挥手

server(服务器)收到了client(客户端)发来的FIN(seq=x+2&&ack=y+1)包后,向client(客户端)发回一个ACK(ack=x+3)包,此时client进入FIN_WAIT_2状态,这表明server已经"同意"client的挥手请求。

第三次挥手

server(服务器)向client(客户端)发送FIN(seq=y+1)包,请求关闭连接,同时server进入LAST_ACK状态。

第四次挥手

client(客户端)收到server(服务器)发送的FIN(seq=y+1)包。然后向server发送ACK(ack=y+2)包,此时client进入TIME_WAIT状态。server收到client的ACK(ack=y+2)包以后,正式关闭连接;client等待一段时间还没有得到回复后判断server(服务器)已正常关闭,于是将自己的连接也正式关闭。

关于TCP滑窗/阻塞处理等问题,以后我会继续在这篇文章下面补充。

谈一下TCP/UDP的区别和优缺点

  1. TCP协议是可靠的而且面向连接,它可以保证信息到达的顺序,UDP和IP协议都是不可靠的协议。

  2. TCP面向字节流,UDP面向报文。

  3. TCP数据传输慢,UDP数据传输快成本低,早期的QQ就是采用的UDP。

说一下计算机之间通信的原理

计算机之间是通过ip和port(端口)来进行通信的,每一台计算都具有一个独立ip地址(在浏览器里面输入ip.cn就可以查看你独有的公网ip地址),和65535个port(端口)。计算机每一个通过网络通信的程序都占有一个独立的port,通过ip我们能确定要访问的计算机,而port(端口)帮助我们要和计算机上的哪一个程序通信。

p.s: 在linux/mac上我们可以通过netstat命令查看本机上哪些端口被占用了。比如在我的计算机上,MySQL占用了3306,Tomcat占用了8080,Nginx占用了80,DNS服务器占用了53,Shadowsocks占用了1080,Privoxy占用了8118。


谈一谈ip地址的分类


关于arp, ip header, tcp header, routing table等问题,以后我会继续在这篇文章下面补充。


说一说常见的服务以及它们对应的默认端口


TCP/UDP端口列表大全详见:https://zh.wikipedia.org/zh-hans/TCP/UDP%E7%AB%AF%E5%8F%A3%E5%88%97%E8%A1%A8。

描述一下在浏览器中输入url后的整个响应过程

下面我们以我们在浏览器中输入segmentfault.com为例子来讲解。

  1. 查找域名(segmentfault.com)对应的IP地址。在linux/mac下可以通过dig命令来查询。

  2. 浏览器根据查询到的IP地址向segmentfault服务器的80端口发送一个HTTP请求(request)

  3. 后台PHP接收到请求(request)后,发回一个网页。

  4. 浏览器收到回复后,解析返回的网页。

上面只是简要的描述,如果要详细展开的话在实在太大了。面试过程中,应该详细描述DNS解析域名的过程,对于浏览器发送的request和response的整个流程可以结合TCP/IP四层模型和OSI七层模型来展开,而对于服务器是如何处理请求的,可以根据网站采用的后台框架详细展开描述。

介绍一下TCP/IP四层模型和OSI七层模型




是时候关注一个只分享干货的公众号了

长按二维码 关注我们

JAVA北京(java_bj)


 
Java北京 更多文章 Java中的ThreadPoolExecutor类 Innodb与MyISAM的区别 缓存架构设计细节二三事 线程数究竟设多少合理 如何选择开源项目?
猜您喜欢 你家的钱是存银行,还是自己保管? 扩展Django的ORM 【机器学习】监督学习之线性回归 Django权限机制的实现