与TCP有关的面试内容

以下内容源于网络资料的学习与整理。

参考博客

TCP/IP四层模型 - BlueTzar - 博客园(OSI参考模型和TCP模型的详解,包括格式

TCP/IP协议-为什么说TCP是可靠连接_shuaixio的博客-CSDN博客(为什么可靠及优缺点

两张动图-彻底明白TCP的三次握手与四次挥手_小书go的博客-CSDN博客_tcp三次握手和四次挥手的全过程(动图很详细,三次握手四次挥手过程

TCP三次握手图解与实践总结_ZengBlog的博客-CSDN博客(代码实践)

1、OSI参考模型和TCP模型

ISO制定的OSI参考模型的过于庞大复杂,招致了许多批评。(记忆:应、表示、会、传输、网络,数据、物理)

与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。

     

在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层。

(1)主机到网络层

实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层-网络互连层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。  

(2)网络互连层  

网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。  

网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。  

网络互连层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,网络互连层还需要完成拥塞控制的功能

(3)传输层  

在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话

在传输层定义了两种服务质量不同的协议:传输控制协议TCP(transmission control protocol)、用户数据报协议UDP(user datagram protocol)。

TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。  

UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。  

(4)应用层

TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。

应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。

2、简述TCP为何可靠?

(1)确认和重传机制

  • 建立连接时三次握手来同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础。
  • 传输过程中,如果Checksum校验失败、丢包或延时,发送端重传。

(2)数据排序

  • TCP有专门的序列号SN字段,可提供数据re-order。

(3)流量控制

  • 滑动窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量。

(4)拥塞控制

  • TCP的拥塞控制由4个核心算法组成:“慢启动”(Slow Start),“拥塞避免”(Congestion avoidance),“快速重传 ”(Fast Retransmit),“快速恢复”(Fast Recovery)。

3、简述TCP和UDP的优缺点

(1)TCP缺点

  • 三次握手四次挥手,传输更多包,浪费一些带宽
  • 为了进行可靠通信,双方都要维持在线,服务器server可能出现非常大的并发连接,浪费了系统资源,甚至会出现宕机。
  • 确认重传也会浪费一些带宽,且在不好的网络中,会不断的断开和连接,降低了传输效率

(2)UDP优点

  • 没有握手,起步快延时小
  • 不需要维持双方在线,server不用维护巨量并发连接,节省了系统资源。
  • 没有重传机制,在不影响使用的情况下,能更高效的利用网络带宽。

4、简述三次握手和四次握手

内容部分源于两张动图-彻底明白TCP的三次握手与四次挥手_小书go的博客-CSDN博客_tcp三次握手和四次挥手的全过程,很棒的一篇博文。

一些符号含义

(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

  • URG:紧急指针(urgent pointer)有效。
  • ACK:确认序号有效。
  • PSH:接收方应该尽快将这个报文交给应用层。
  • RST:重置连接。
  • SYN:发起一个新连接。
  • FIN:释放一个连接。

需要注意:不要将确认序号ack与标志位中的ACK搞混了;确认方ack=发起方req+1,两端配对。

(1)三次握手

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

  1. TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
  2. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
  3. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
  4. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
  5. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

为什么TCP客户端最后还要发送一次确认呢?

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

(2)四次挥手

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

为什么客户端最后还要等待2MSL?

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登录后跳转到原页面

可以在点击登录页面时,进行url传值,比如从a.html到b.html,可以a.html?oldurlb.html 带有特殊符号、中文的可以加个encodeURIComponent()转载于:https://www.cnblogs.com/wuchao/p/3179350.html

c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...

#include#include#include#include#include#includevoid pause();typedef struct STUDENT{char studentNumber[20]; //学生学号char studentName[20]; //学生姓名char className[20]; //班级名称float chinese; //语文绩float maths; //数学成绩float english; //外语成绩float…

嵌入式面试中常见的编程题目

以下内容源于网络资料的学习整理,如有侵权,请告知删除。 目录 1、将字符串反转 2、数字翻转和回文判断 3、大小端问题 (1)判断大小端 (2)大小端转换 4、实现函数memcpy(), strcpy(), strcmp(), strc…

用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题

用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题 用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题 提示找不到表,我去看了一下,丢失了很多个表; 问题: 直接拷贝data下的数据库数据进行备份…

回旋矩形C语言,C语言回旋函数解释下,该如何处理

当前位置:我的异常网 C语言 C语言回旋函数解释下,该如何处理C语言回旋函数解释下,该如何处理www.myexceptions.net 网友分享于:2013-06-08 浏览:30次C语言回旋函数解释下给定两个整数M,N,生成一个M*N的矩阵,矩阵中元…

JUnit4概述

JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也就是说,这个东西在…

嵌入式面试中常见的问答题(线程进程、TCP等)

以下内容源于网络资料的学习整理,如有侵权,请告知删除。 一、线程、进程的区别联系 见https://blog.csdn.net/oqqHuTu12345678/article/details/72637318的表格 个人理解:进程相当于一个运行中的程序,线程相当于程序中的某些函数…

c语言读取文件到结构体数组,有关文件读写到结构体数组问题;

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼typedef struct IMG{char *name;int weight;int height;}IMG;这是我的结构体存的是 图片的名字 宽度 高度void readWeightHeight(void){FILE *fpbmp;//FILE *fpm;char filename[54];char *bmpname NULL;long Handle;int i 0;struc…

正则表达式30分钟入门教程(转)

分享到一键分享QQ空间新浪微博百度云收藏人人网腾讯微博百度相册开心网腾讯朋友百度贴吧豆瓣网搜狐微博百度新首页QQ好友和讯微博更多...百度分享首页 | 正则表达式30分钟入门教程 | 常用正则表达式| 正则表达式速查表 | 正则表达式测试工具 | 正则表达式 | 正则练习器在线版 正…

进程、线程简介

以下内容源于网络资源的学习整理,如有侵权,请告知删除。 参考博客 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html(通俗理解) https://blog.csdn.net/chen_geng/article/details/51613445(表格…

使用keil建立标准STM32工程模版(图文详细版!)

1. 模板工程的创建(超级详细版,使用的是keil 4.5版本) 1.1创建工程目录 良好的工程结构能让文件的管理更科学,让开发更容易更方便,希望大家养成良好的习惯,使用具有合理结构的工程目录,当你着手于较大的软件项目时&a…

android竖直和横向,如何在android中为纵向和横向模式定义不同的控件

定义,在这两种资源的文件出现在你的代码 并在onCreate()在所有视图中Activity可以检查方向绑定的意见,你的类的对象。示例。在这里我们有包含在这两个文件的ImageView的,并在画像文件有一个TextView和景观它包含Button代替TextViewmy_layout.…

正则表达式匹配多个字符串中的一个

正则表达式匹配多个字符串中的一个 当我们采集数据时&#xff0c;会用到正则匹配功能 (前缀)(?<content>[\s\S]*?)(后缀) 例如采集产品多图时&#xff0c;前缀与后缀部分一般情况下是不相同的&#xff0c;这就需要用到正则的“|” (href"|src")(?<conten…

与驱动有关的面试问题

以下内容源于网络资料的整理学习。 参考博客 嵌入式驱动那年的笔试面试-有干货_BeyondTheBoundary的博客-CSDN博客_芯动科技嵌入式笔试 嵌入式驱动工程师面试题集锦_shx516857593的博客-CSDN博客 嵌入式面试中可能问到的题目和答案整理&#xff08;内核驱动篇&#xff09;_…

爬虫那些事儿-- 简介

从事爬虫相关的工作已经两年多了。简要做下总结。 爬虫(Crawler)&#xff0c;有些也叫蜘蛛&#xff08;Spider&#xff09;&#xff0c;用来从互联网下载网页。是搜索引擎的重要组成。爬虫是搜索引擎的数据来源&#xff0c;是数据的入口。爬虫的基本思想是认为整个互联网类似于…

android模拟机新闻APP,DavidTGNewsProject

DavidTGNewsProject##【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端(原创作品&#xff0c;转载请说明出处)先给大家看一下效果图&#xff1a;这个项目总体来说虽然不是特别难&#xff0c;但是确实非常常用的功能。是业余时间自己写的一个小项目。以前我们写的时…

轻操作动作休闲单机游戏《狂斩三国2》评测

游戏类别&#xff1a;动作休闲单机游戏时隔一年&#xff0c;曾在国内和台湾手游市 场获得top1佳绩的《狂斩三国》再度归来&#xff01;其策略加动作的独特玩法在当时颠覆了玩家们对三国游戏的阵营认知。比传统策略更简单明快&#xff0c;比传统动作无脑砍更 具思考乐趣&#xf…

物联网简介

以下内容源于朱有鹏老师课程的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 本文档提供下载&#xff1a;提取码1111——物联网简介 1、什么是物联网 1.1.物联网的概念和发展历程 1.1.1、认识物联网 &#xff08;1&#xff09;百度百科中物联网定义 &#xff08;…

php计算代码运行时间与内存使用的一段代码

计算运行时间及内存使用&#xff0c;代码如下&#xff1a; <?php //开始计时 $HeaderTime microtime(true);//参数true表示返回浮点数值//代码//...printf(" total run: %.2f s<br>". "memory usage: %.2f M<br> ", microtime(true)-$Hea…

Mysql语句与应用

2019独角兽企业重金招聘Python工程师标准>>> 1。正则表达式 搜索多个关键词&#xff0c;“或”, 等同 %上海% | %内蒙古% SELECT * FROM analysis_result WHERE result REGEXP 上海|内蒙古 LIMIT 1; "且" SELECT * FROM analysis_result WHERE id 1 AND …