首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
课程
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
在线笔面试、雇主品牌宣传
登录
/
注册
学习j
门头沟学院 电子信息类
发布于安徽
关注
已关注
取消关注
@牛客382430241号:
一文吃透TCP面试八股文
计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才。说说TCP的三次握手假设发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSED。************第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中包含标志位SYN=1,序列号seq=x。第一次握手前客户端的状态为CLOSE,第一次握手后客户端的状态为SYN-SENT。此时服务端的状态为LISTEN。第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端的起始序列号y,然后给客户端回复一段报文,其中包括标志位SYN=1,ACK=1,序列号seq=y,确认号ack=x+1。第二次握手前服务端的状态为LISTEN,第二次握手后服务端的状态为SYN-RCVD,此时客户端的状态为SYN-SENT。(其中SYN=1表示要和客户端建立一个连接,ACK=1表示确认序号有效)第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中包含标志位ACK=1,序列号seq=x+1,确认号ack=y+1。第三次握手前客户端的状态为SYN-SENT,第三次握手后客户端和服务端的状态都为ESTABLISHED。此时连接建立完成。两次握手可以吗?之所以需要第三次握手,主要为了防止已失效的连接请求报文段突然又传输到了服务端,导致产生问题。比如客户端A发出连接请求,可能因为网络阻塞原因,A没有收到确认报文,于是A再重传一次连接请求。然后连接成功,等待数据传输完毕后,就释放了连接。然后A发出的第一个连接请求等到连接释放以后的某个时间才到达服务端B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认报文段。如果不采用三次握手,只要B发出确认,就建立新的连接了,此时A不会响应B的确认且不发送数据,则B一直等待A发送数据,浪费资源。本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~********如果访问不了Github,可以访问*******。*******为什么需要TCP协议?IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。说说TCP的四次挥手A的应用进程先向其TCP发出连接释放报文段(FIN=1,seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。B收到连接释放报文段后即发出确认报文段(ACK=1,ack=u+1,seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。B发送完数据,就会发出连接释放报文段(FIN=1,ACK=1,seq=w,ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL(最大报文段生存时间)后,A才进入CLOSED状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。第四次挥手为什么要等待2MSL?保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED状态。防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段。为什么是四次挥手?因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。但是在关闭连接时,当Server端收到Client端发出的连接释放报文时,很可能并不会立即关闭SOCKET,所以Server端先回复一个ACK报文,告诉Client端我收到你的连接释放报文了。只有等到Server端所有的报文都发送完了,这时Server端才能发送连接释放报文,之后两边才会真正的断开连接。故需要四次挥手。说说TCP报文首部有哪些字段,其作用又分别是什么?16位端口号:源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。4位头部长度:表示tcp头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。6位标志位:URG(紧急指针是否有效),ACk(表示确认号是否有效),PSH(缓冲区尚未填满),RST(表示要求对方重新建立连接),SYN(建立连接消息标志接),FIN(表示告知对方本端要关闭连接了)16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。************TCP有哪些特点?TCP是面向连接的运输层协议。点对点,每一条TCP连接只能有两个端点。TCP提供可靠交付的服务。TCP提供全双工通信。面向字节流。TCP和UDP的区别?TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。TCP提供可靠的服务;UDP不保证可靠交付。TCP面向字节流,把数据看成一连串无结构的字节流;UDP是面向报文的。TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的通信方式。TCP首部开销20字节;UDP的首部开销小,只有8个字节。TCP 和 UDP 分别对应的常见应用层协议有哪些?基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSHHTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25TELNET: Teletype over the Network (网络电传), 默认端口23SSH:Secure Shell(安全外壳协议),默认端口 22基于UDP的应用层协议:DNS、TFTP、SNMPDNS : Domain Name Service (域名服务),默认端口 53TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69SNMP:Simple Network Management Protocol(简单网络管理协议),通过UDP端口161接收,只有Trap信息采用UDP端口162。TCP的粘包和拆包TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。为什么会产生粘包和拆包呢?要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。解决方案:发送端将每个数据包封装为固定长度在数据尾部增加特殊字符进行分割将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。说说TCP是如何确保可靠性的呢?首先,TCP的连接是基于三次握手,而断开则是基于四次挥手。确保连接和断开的可靠性。其次,TCP的可靠性,还体现在有状态;TCP会记录哪些数据发送了,哪些数据被接收了,哪些没有被接受,并且保证数据包按序到达,保证数据传输不出差错。再次,TCP的可靠性,还体现在可控制。它有数据包校验、ACK应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制。说下TCP的滑动窗口机制TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 TCP会话的双方都各自维护一个发送窗口和一个接收窗口。接收窗口大小取决于应用、系统、硬件的限制。发送窗口则取决于对端通告的接收窗口。接收方发送的确认报文中的window字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文window字段设置为 0,则发送方不能发送数据。TCP头包含window字段,16bit位,它代表的是窗口的字节容量,最大为65535。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。接收窗口的大小是约等于发送窗口的大小。详细讲一下拥塞控制?防止过多的数据注入到网络中。 几种拥塞控制方法:慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。慢开始把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。当 cwnd < ssthresh 时,使用慢开始算法。当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。拥塞避免让拥塞窗口cwnd缓慢地增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。快重传有时个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。快重传算法可以避免这个问题。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,使发送方及早知道有报文段没有到达对方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。快恢复当发送方连续收到三个重复确认,就会把慢开始门限ssthresh减半,接着把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。 采用这样的拥塞控制方法使得TCP的性能有明显的改进。什么是 SYN 攻击?我们都知道 TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到 一个 SYN 报文,就进入 SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的ACK 应答,久而久之就会占满服务端的 SYN 接收队列(未连接队列),使得服务器不能为正常用户服务。如何唯一确定一个TCP连接呢?TCP 四元组可以唯一的确定一个连接,四元组包括如下: 源地址 源端口 目的地址 目的端口。源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。最后给大家分享一个Github仓库,上面有大彬整理的300多本经典的计算机书籍PDF,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~********如果访问不了Github,可以访问****。****
点赞 34
评论 4
全部评论
推荐
最新
楼层
国泰君安
校招火热招聘中
官网直投
相关推荐
运营老司机王学长
06-12 23:02
已编辑
运营
不纠结一页,两页简历照样拿下大厂
在小红书和牛客都刷到很多关于简历一页的帖子,包括有些简历硬凑一页字体非常小看起来很不舒服,文笔一般,理科生直接上重点。为什么大家都觉得简历最好一页,主要有两个原因:1,简历超过一页内容冗余,HR和面试官没有兴趣看完2,历史原因,一张A4纸方面看,不容易遗漏。网上有很多简历超过一页结果面试官没注意到的案例看完这几点,你就不会在纠结了1,对于HR和面试官来说,冗余的从来不是简历页数,设计类的同学应该最有经验,加上作品集一个文档10+页都有可能。冗余的是内容,当你的简历有价值的内容超过一页的时候,我们都是看下去的,主要有价值。有多少人因为什么东西都没有,好不容易硬凑字数才让一页简历看起来没那么空。但...
投递小红书等公司9个岗位 >
简历被挂麻了,求建议
简历中的项目经历要怎么写
点赞
评论
收藏
分享
moonchildddddd
06-14 17:54
已编辑
合肥工业大学 计算机类
字节 国际商业 一面
项目相关:黑马点评 easypan如何应对缓存穿透:写空值、bloom filterbloom filter:有什么问题;如何优化?存在假阳性问题,回答说可以结合写空值方法。面试官说思路ok介绍下使用分布式锁的效果提升,多少qps,考虑过使用多把锁的情况吗如果让你设计一下秒杀场景,你会如何考虑?redis缓存、lua脚本、消息队列、消息队列确认机制介绍大文件分片上传、断点重传的使用方案MD5签名,有考虑过使用其他方式吗?MD5有什么问题,MD5存在一种主动碰撞的漏洞,如何处理有考虑实现分布式存储吗?对于分布式存储,为了保证文件安全性可用性八股相关:了解过CAP吗?(到这已经感觉麻木了,为什么问...
字节跳动一面235人在聊
查看11道真题和解析
点赞
评论
收藏
分享
最喜欢秋天的大卫很无语
04-28 13:08
浙江工业大学 自动化类
有大佬帮看看简历吗,实习都找不到
😵😵
点赞
评论
收藏
分享
别刷了开摆
04-22 15:19
门头沟学院 电子信息类
java找实习要不要换个项目啊。。没多少
要不要花几天换个项目,把外卖换掉,感觉简历送出去没多少面试啊,另外,五月份还有机会找得到实习吗,我只要有实习就行了😢😢😢 #实习,投递多份简历没人回复怎么办# #java#
实习,投递多份简历没人回复怎么办
点赞
评论
收藏
分享
豁达的羚羊在喝茶
06-13 14:55
C++
华为海思软件开发暑期实习捞人!!!
还没招够!笔试过了还没面试的!笔试挂了的!都可以私聊了解下情况
投递海思半导体等公司10个岗位 >
点赞
评论
收藏
分享
点赞
收藏
评论
分享
回复帖子
提到的真题
返回内容
全站热榜
1
...
5000字说透简历和面试核心要点
2.1W
2
...
手上只有1个看不上的实习offer要不要去?
5600
3
...
你怎么看今年的秋招?预测一波
5383
4
...
6.13校招&实习招聘信息汇总
5166
5
...
除了互联网,还能关注哪些公司
5152
6
...
关于实习的转正、边秋招、没实习的相关问题
3685
7
...
华为许愿
2431
8
...
好未来面试记录
2419
9
...
oppo VS 京东
2391
10
...
重庆移动实习
1894
正在热议
#
牛客帮帮团来啦!有问必答
#
1327750次浏览
18670人参与
#
非技术岗薪资爆料
#
53328次浏览
730人参与
#
不去互联网可以去金融科技
#
47500次浏览
507人参与
#
和牛牛一起刷题打卡
#
44770次浏览
3574人参与
#
写简历别走弯路
#
360191次浏览
4535人参与
#
我发现了面试通关密码
#
409351次浏览
7309人参与
#
极具前瞻性,现代汽车编程题
#
9457次浏览
188人参与
#
产品每日一题
#
1704次浏览
93人参与
#
来聊聊你目前的求职进展
#
229859次浏览
2905人参与
#
华子oc时间线
#
11214次浏览
60人参与
#
投递实习岗位前的准备
#
753477次浏览
13146人参与
#
如果可以选,你最想从事什么工作
#
219845次浏览
3401人参与
#
晒一晒我的offer
#
4031005次浏览
60398人参与
#
国企vs私企,你更想去?
#
34549次浏览
404人参与
#
我想象的工作vs实际工作
#
116822次浏览
1807人参与
#
软件开发2024笔面经
#
1570447次浏览
36085人参与
#
硬件兄弟们 甩出你的华为奖状
#
37909次浏览
224人参与
#
24届软开秋招面试经验大赏
#
1238980次浏览
18675人参与
#
互联网公司评价
#
105783次浏览
1371人参与
#
参加过提前批的机械人,你们还参加秋招么
#
16649次浏览
382人参与
#
百度工作体验
#
31928次浏览
315人参与
#
机械制造笔面经
#
11638次浏览
332人参与
牛客网
牛客企业服务