1、TCP三次握手过程

  wireshark抓包为:(wireshark会将seq序号和ACK自己主动显示为相对值)   

  

  

  1)主机A发送标志syn=1,随机产生seq =1234567的数据包到server,主机B由syn=1知道,A要求建立连接; 此时状态A为SYN_SENT,B为LISTEN

  

  

  2)主机B收到请求后要确认连接信息。向A发送ack =(主机A的seq+1),标志syn=1,ack=1,随机产生seq=7654321的包。 此时状态A为ESTABLISHED。B为SYN_RCVD 

  

  

  3)主机A收到后检查ack 是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确。主机A会再发送ack =(主机B的seq+1),标志ack=1。主机B收到后确认seq值与ack=1则连接建立成功。 此时A、B状态都变为ESTABLISHED   

  

2、TCP四次挥手过程

  断开连接过程与建立连接相似

1)主机A发送位码为FIN=1,用来关闭客户A到serverB的数据传送。

此时A的状态为FIN_WAIT_1

2)serverB收到这个FIN。它发回一个ACK,确认序号为收到的序号加1。此时A为FIN_WAIT_2。B为CLOSE_WAIT

3)serverB关闭与clientA的连接。发送一个FIN给clientA。此时A为TIME_WAIT。B为LAST_ACK

4)clientA发回ACK报文确认,并将确认序号设置为收到序号加1。此时A、B都关闭了。状态变为CLOSED。

当(2)、(3)步中的ACK和FIN在一个包中发送时,A的状态会直接从FIN_WAIT_1变为TIME_WAIT

3、为什么建立连接须要三次握手。而断开连接须要四次握手

  由于每一个方向都须要一个FIN和ACK。当一端发送了FIN包之后,处于半关闭状态,此时仍然能够接收数据包。

  在建立连接时。server能够把SYN和ACK放在一个包中发送。

  可是在断开连接时。假设一端收到FIN包,但此时仍有数据未发送完。此时就须要先向对端回复FIN包的ACK。等到将剩下的数据都发送完之后,再向对端发送FIN,断开这个方向的连接。

  因此非常多时候FIN和ACK须要在两个数据包中发送,因此须要四次握手

4、TIME_WAIT状态持续时间及原因

  持续时间未2MSL。一个数据包在网络中的最长生存时间为MSL。

  假设最后client回复的ACK丢失。server端会在超时时间到来时,重传最后一个FIN包。

  ACK和FIN在网络中的最长生存时间就为2MSL。这样就能够可靠的断开TCP的双向连接。

5、超时重传和高速重传   

  • 超时重传:当超时时间到达时,发送方还未收到对端的ACK确认。就重传该数据包
  • 高速重传:当后面的序号先到达,如接收方接收到了1、 3、 4,而2没有收到,就会马上向发送方反复发送三次ACK=2的确认请求重传。

    假设发送方连续收到3个同样序号的ACK,就重传该数据包。

    而不用等待超时

6、TCP首部长度,有哪些字段

7、TCP选项有哪些

  TCP首部选项字段多达40B。一些经常使用的字段有:

  1)选项结束字段(EOP,0x00)。占1B,一个报文段仅用一次。放在末尾用于填充。用途是说明:首部已经没有很多其他的消息,应用数据在下一个32位字開始处

  2)无操作字段(NOP, 0x01)。占1B,也用于填充,放在选项的开头

  3)MSS(最大报文段长度)。格式例如以下:种类(1B,值为2)。长度(1B。值为4),数值(2B)

  用于在连接開始时确定MSS的大小,假设没有确定,就用默认的(一般实现是536B)

  4)窗体扩大因子,格式例如以下:种类(1B,值为3),长度(1B,值为3),数值(1B)

  新窗体值 = 首部窗体值 * 2的(扩大因子)次方

  当通信两方觉得首部的窗体值还不够大的时候,在连接開始时用这个来定义更大的窗体。仅在连接開始时有效。一经定义。通信过程中无法更改。

  5)时间戳(应用測试RTT和防止序号绕回)

  6)同意SACK和SACK选项

8、TCP在listen时的參数backlog的意义

  linux内核中会维护两个队列:

  1)未完毕队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态

  2)已完毕队列:已完毕TCP三次握手过程,处于ESTABLISHED状态

  当有一个SYN到来请求建立连接时,就在未完毕队列中新建一项。当三次握手过程完毕后,就将套接口从未完毕队列移动到已完毕队列。

  backlog曾被定义为两个队列的总和的最大值,也曾将backlog的1.5倍作为未完毕队列的最大长度

一般将backlog指定为5

9、accept发生在三次握手的哪一步

  accept会监听已完毕队列是否非空。当队列为空时,accept就会堵塞。当队列非空时,就从已完毕队列中取出一项并返回。

  而已完毕队列中的都是三次握手过程已经完毕的,因此accept发生在三次握手之后。

10、三次握手过程中有哪些不安全性

  1)伪装的IP向server发送一个SYN请求建立连接。然后server向该IP回复SYN和ACK。可是找不到该IP相应的主机,当超时时server收不到ACK会反复发送。

当大量的攻击者请求建立连接时。server就会存在大量未完毕三次握手的连接,server主机backlog被耗尽而不能响应其他连接。即SYN泛洪攻击

  防范措施:

  1、减少SYN timeout时间。使得主机尽快释放半连接的占用

  2、採用SYN cookie设置,假设短时间内连续收到某个IP的反复SYN请求,则觉得受到了该IP的攻击,丢弃来自该IP的兴许请求报文

  3、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由

  2)当一个主机向server发送SYN请求连接。server回复ACK和SYN后。攻击者截获ACK和SYN。

然后伪装成原始主机继续与server进行通信。

  

11、TCP和UDP的差别

  • TCP是有连接的,两台主机在进行数据交互之前必须先通过三次握手建立连接;而UDP是无连接的,没有建立连接这个过程
  • TCP是可靠的传输。TCP协议通过确认和重传机制来保证传输数据的可靠性;而UDP是不可靠的传输
  • TCP还提供了拥塞控制、滑动窗体等机制来保证传输的质量,而UDP都没有
  • TCP是基于字节流的,将数据看做无结构的字节流进行传输,当应用程序交给TCP的数据长度太长,超过MSS时。TCP就会对数据进行分段。因此TCP的数据是无边界的。而UDP是面向报文的。不管应用程序交给UDP层多长的报文,UDP都不会对数据报进行不论什么拆分等处理,因此UDP保留了应用层数据的边界

12、有哪些应用层协议是基于TCP的,哪些是基于UDP的

  • TCP: FTP、HTTP、Telnet、SMTP、POP3、HTTPS
  • UDP:DNS、SNMP、NFS

TCP相关面试题总结的更多相关文章

  1. TCP相关面试题(转)

    1.TCP三次握手过程 wireshark抓包为:(wireshark会将seq序号和ACK自动显示为相对值)       1)主机A发送标志syn=1,随机产生seq =1234567的数据包到服务 ...

  2. C# 相关面试试题简单的总结

    最近一个搞NET开发的朋友离职了,想让我给他找点关于NET的相关面试题,准备抱一下佛脚,迎接新的挑战. 我赶紧找到以前检索的各种宝典,试题,今天梳理一下关于NET的基础知识点. 1.面向对象语言的三大 ...

  3. Linux相关面试题&答案

    Linux相关面试题&答案 Linux面试题&答案 假设apache日志格式为:118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] " ...

  4. HashMap源码与相关面试题

    一.哈希表 哈希表是一种可以快速定位得数据结构.哈希表可以做到平均查找.插入.删除时间是O(1),当然这是指不发生Hash碰撞得情况.而哈希表最大得缺陷就是哈希值得碰撞(collision). Has ...

  5. spring MyBatis的相关面试题

    (相关面试题! 供参考!) 1.ORM框架有哪些? MyBatis:半自动化框架(不是纯ORM) 需要写动态SQL语句,实体类和SQL语句之间建立映射关系 Spring:轻量级框架, Java EE的 ...

  6. Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!

    Tomcat相关的面试题出场的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握. 这次整理了Tomcat相关的系统架构,介绍了Server.Service.Connector.Con ...

  7. dubbo 相关面试题 有用

    调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...

  8. dubbo 相关面试题 有用(转)

    调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...

  9. Struts2相关面试题

    Struts2面试题 1.struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 核心 ...

随机推荐

  1. [Visual Studio] VS2012调试时很慢的解决方案

      1.转自http://guooge.com/archives/408.html VS2010调试极慢获取出现死机,因为启动了IntelliTrace Visual Studio 2010 Ulti ...

  2. saga中的saga(A Saga on Sagas)

    此文翻译自msdn,侵删. 原文地址:https://msdn.microsoft.com/en-us/library/jj591569.aspx Process Managers, Coordina ...

  3. Syncovery : Google Docs protocol completely replaced with Google Drive

    Google Docs protocol completely replaced with Google Drive In May 2015, the older Google Docs API wa ...

  4. Install WordPress Plugins without FTP Access

    WordPress will only prompt you for your FTP connection information while trying to install plugins o ...

  5. JavaScript 新手的踩坑日记

    引语 在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个名字.由于商标问题以及很多产品已经 ...

  6. 用最简单的例子理解观察者模式(Observer Pattern)

    假设有一个软件公司,每当有新产品推出,就把信息通知到一些客户. 把通知这个动作抽象成一个接口. public interface IService { void Notif(); } 客户如果想获得通 ...

  7. go test 单元函数测试

    首先安装单元测试包,go get github.com/smartystreets/goconvey/convey 源程序如下,定义了加减乘除4个函数 package test222 import ( ...

  8. sql递归查询子级

    WITH T(emp_no, name, dept_no, the_level, path,path1,manager_id) AS( SELECT emp_no, name, dept_no ,1 ...

  9. 【BZOJ】【2750】【HAOI2012】Road

    最短路+拓扑序DP orz zyf & lyd 统计每条边在多少条最短路径上……其实可以统计 有多少条最短路径经过了x,以及y出发到达任意一个结束点有多少种走法(沿最短路) 我们可以用Dijk ...

  10. BZOJ 4145 [AMPPZ2014] The Prices 解题报告

    感觉也是一个小清新题.. 我们考虑设立状态 $Dp[i][s]$ 表示考虑了前 $i$ 个商店后,购买状态为 $s$ 的最小花费. 转移的话就枚举每个商店 $i$,首先令: $$Dp[i][s] = ...