作者:晨钟暮鼓c
个人微信公众号:程序猿的月光宝盒


1.说说TCP三次握手

1.0 在此之前,什么是TCP?

​ TCP(传输控制协议)

​ 1.面向连接的,可靠的,基于字节流的传输层通信协议

​ 2.将应用层的数据流分割成报文段并发送给目标节点的TCP层

​ 3.数据包都有序号,对方收到则发送ACK确认,未收到则重传

​ 4.使用校验和来检验数据在传输过程中是否有误


**注: ACK--确认序号标志,即接收端实体对已成功收到的包的确认,(确认后+1)

​ SYN--同步序号,用于建立连接过程

​ 在连接请求中,SYN=1,ACK=0-->该数据段没有使用捎带的确认域,SYN=1,ACK=1-->连接应答捎带一个确认域

​ FIN:finish标志,用于释放连接,等于1时,表示发送方已经没有数据发送,即关闭数据流

​ Sequence Numbe:数据包的序号,用来保证不丢包


1.1 "握手"是为了连接,TCP三次握手如上图所示

**图注:第一次握手,seq-->初始序号,x是任意正整数.发送的不能携带数据,但是,要消耗掉一个序号.

​ 第二次握手,如果同意连接,就发出确认报文,ack=x+1(第一次握手中seq=x,1即上一个报文消耗的序列),同时,为自己的缓存初始化序列号,即seq=y,SYN-RCVD:同步收到状态.(也不能携带数据,并且也要消耗一个序号)

​ 第三次握手,当TCP客户进程收到确认报文之后,还要向服务器给出确认,ack=y+1(上一次seq=y,1是小号的序号),seq=x+1(先前告知客户端序号+1),此时,客户端连接建立,ESTAB-LESHED(已建立连接状态),TCP规定,第三次握手的时候可以(也不是必须,如果不携带数据,就不会消耗序号)携带数据

​ 当服务器接收到后,也进入,ESTAB-LESHED(已建立连接状态),,双方开始通信


​ 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接

​ 第1次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入 SYN_SENT(同步已发送)状态,等待服务器确认

​ 第2次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时,自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RCVD状态;

​ 第3次握手:客户端接收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTAB-LISHED状态,完成三次握手.

1.2 为什么需要三次握手才能建立连接

​ 为了初始化Sequence Number的初始值,通信的双方要互相通知对方,自己的初始化的Sequence Number,也就是上图中的x和y,这个Number要作为以后的数据通信的序,以保证接收到的数据不会因为网络的问题而乱序,即TCP会用这个序号来拼接数据,因此,在服务器回发他的Sequence Number(第二次握手之后),还需要发送确认报文给服务器,告知服务器,客户端已接收到你发的初始化的Sequence Number了.

1.3 首次捂手的隐患---SYN超时

​ 问题起因:

​ Server收到Client的SYN,回复SYN-ACK时没有收到ACK确认

​ Server不断重试直到超时,linux默认重试次数为5次,时间从一秒开始,每次翻倍. 5次总共31s,在第五次发出去之后还需要等待32s才能被判定为超时,总共31+32=63s,此时TCP断开连接.

​ 后果:

​ 可能会让服务器遭到SYN Flood的风险.

​ 解决方案:

​ linux下,SYN队列满后,通过tcp_syncookies(Sequence Number的简称)参数回发SYN Cookie

​ 若正常连接则Client会回发SYN Cookie,直接建立连接

1.4 建立连接后,Client出故障怎么办

TCP的保活机制

1.向对方发送保活探测报文,如果未收到响应则继续发送
2.尝试次数达到保活探测数仍未收到响应则中断连接

Java每日一面(Part1:计算机网络)[19/10/13]的更多相关文章

  1. Java每日一面(Part1:计算机网络)[19/11/13]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[1] 1.1 HTTP简介 ​ HTTP协议,即超文本传输协议,属于应用层的协议,他是基于请求和响应模式的无状态的 应用层协议. ...

  2. Java每日一面(Part1:计算机网络)[19/10/21]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.UDP简介 1.1UDP报文结构: ​ Source Port:源端口 Destination Port:目标端口 Length:数据包长度 C ...

  3. Java每日一面(Part1:计算机网络)[19/10/14]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.1 说一说TCP的四次挥手 ​ "挥手",即终止TCP连接,断开一个TCP连接池. ​ 需要客户端和服务端总共发出四个包,以 ...

  4. Java每日一面(Part1:计算机网络)[19/11/25]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[2] 1.1Get请求和Post请求的区别 从三个层面来回答: 1.1.1 从HTTP报文层面: ​ Get请求将请求信息放在UR ...

  5. Java每日一面(Part1:计算机网络)[19/11/02]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.TCP的滑动窗口 1.1 RTT和RTO的区别 ​ RTT:发送一个数据包到收到对应的ACK,所花费的时间 ​ RTO:重传时间间隔,TCP在发 ...

  6. Java每日一面(Part2数据库)[19/11/28]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.如何设计一个关系型数据库 如上图,首先划分成两大部分: ​ 1.存储部分:类似一个文件系统,把数据存储到一个持久化设备中,如机械硬盘,固态等 ​ ...

  7. macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏问题

    macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏会消失,估计不止出现在PhpStorm,一系列jetbrains的产品可能都会有这个问题,包括eclipis ...

  8. Java Web学习总结(19)——web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  9. 【Java每日一题】20161214

    package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1214 { public s ...

随机推荐

  1. SpringMVC深入浅出(一)

    1.Springmvc是什么 是一个表现层框架,用于接受请求及参数,响应请求回显数据. 2.SpringMVC处理流程 SpringMVC流程 1.  用户发送请求至前端控制器DispatcherSe ...

  2. Golang 入门系列(十二)ORM框架gorm

    之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...

  3. 如何提高 PHP 代码的质量?第三:端到端 / 集成测试

    在本系列的最后一部分,是时候设置端到端 / 集成测试环境,并确保我们已经准备好检查我们工作的质量. 在本系列的前几部分中,我们建立了一个构建工具,一些静态代码分析器,并开始编写单元测试. 为了使我们的 ...

  4. 2019 Vue开发指南:你都需要学点啥?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://dzone.com/articles/vue-development-in-2019 ...

  5. [debug] 解决pycharm中无法import自己建立的模块问题

    修改文件夹属性,将其改为"resource",就可以来import了.

  6. Python高级特性——切片(Slice)

    摘录廖雪峰网站 定义一个list: L = ['haha','xixi','hehe','heihei','gaga'] 取其前三个元素: >>> L[0],L[1],L[2] (' ...

  7. asp.net 页面中添加普通视频的几种方式

    第一种 是通过调用window media player进行播放诸如:wmv,asf等格式文件: <object align=center class="OBJECT" cl ...

  8. ARTS改版啦,在改变中前行

    这次打卡,稍微进行了一次改版,在算法和英文文档上进行了拆分,具体的内容在前两天的文章里已经输出,所以在这篇上针对这两块做了一个汇总. 当然,技巧方面的还是在这里先输出,后续再考虑整改吧.循序渐进地上升 ...

  9. 对java异常的总结及java项目中的常用的异常处理情况

    文章涉及内容来源:黑马程序员自学整理的笔记,网上查阅资料,以及转载名为墨钺的博客大佬,附上博客转载地址:https://www.cnblogs.com/gothic-death/p/9946415.h ...

  10. Git 在同一台机器上配置多个Git帐号

    在同一台机器上配置多个Git帐号 By:授客 QQ:1033553122 实践环境 win10 Git-2.21.0-64-bit.exe TortoiseGit-2.8.0.0-64bit.msi ...