TCP连接建立和终止小结
TCP连接建立(三次握手)
如图:
- 请求端发送一个SYN到服务器的相应端口,以及初始序号ISN
- 服务器发送包含服务器的初始序号的SYN作为应答,同时确认序号设置为客户的ISN+1
- 客户将确认序号设置为服务器的ISN+1
最大报文段长度(MSS)
- 连接建立时,连接的双方都要通告各自的MSS。当建立一个连接时,每一方都有通告它期望接收的MSS选项。如果一方不接收来自另一方的MSS值,则MSS就定为576字节。对于一个以太网,MSS可达1460字节(1460 + IP首部20 + TCP首部20 = 1500)。如果目的IP地址是“非本地的”, MSS通常的默认值是536。
- MSS让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小MTU连接到一个网络的主机避免分段。
- 如果两端的主机都连接到以太网上,都采用536的MSS, 但中间网络采用296的MTU,也将会出现分段, 使用路径上的MTU发现机制是关于这个问题的唯一方法。
同时打开
一般情况下,连接建立时是一方发送SYN,另一方发送SYN+ACK, 但极个别情况下,有可能两个应用程序几乎同时向对方发送SYN,这就叫做同时打开。同时打开需要双方都使用彼此熟知的端口,而不是一般情况下只需要客户使用服务器的知名端口。
TCP的同时打开的状态变迁图如下:
两端几乎同时发送SYN,并进入SYN_SENT状态。当每一端收到SYN时,状态变为SYN_RCVD,同时它们都再发SYN并对收到的SYN进行确认。当双方都收到SYN及相应的ACK时,状态都变迁为ESTABLISHED。
呼入连接请求队列
有可能出现当服务器在创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达多个连接请求,当服务器处于忙时,TCP是如何处理这些呼入的连接请求?
在伯克利的TCP实现中采用以下规则:
- 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被TCP接受(即三次握手已完成),但还没有被应用层所接受。注意区分TCP接受一个连接是将其放入队列,而应用层是将其从该队列中移出。
- 应用层将指明该队列的最大长度,这个值称为积压值。它的取值范围是0~5之间的整数。
- 当一个连接请求到达时,TCP使用一个算法,来确定是否接收这个连接。
- 如果对于新的连接请求,该TCP监听的端点的连接队列中还有空间,TCP模块将对这个SYN进行确认并完成连接的建立。但应用层只有在三次握手中的第三个报文段才能知道这个新连接。另外,当客户进程的主动打开成功但服务器的应用层还不知道这个新的连接时,它可能会认为服务器进程已经准备好接收数据了(如果发生这种情况,服务器的TCP仅将接收的数据放入缓冲队列)。
- 如果对于新的连接请求,连接队列已没有空间,TCP将不理会收到的SYN,也不发回任何报文段(即不发回RST),如果应用层不能及时接受已被TCP接受的连接,这些连接可能占满整个连接队列,客户的主动打开将最终超时。
当队列已满时,TCP将不理会收到的SYN,也不发回任何报文段(即不发回RST),因为这是一个软错误,而不是一个硬错误。通常队列已满是由于应用程序或操作系统忙造成的,这样可防止应用程序对传入的连接进行服务。这个条件在很短的时间内可以改变。但如果服务器的TCP以系统复位作为响应,客户进程的主动打开将被废弃。由于不应答SYN,服务器程序迫使客户TCP随后重传SYN,以等待连接队列有空间接受新的连接。
TCP连接终止(四次握手)
既然一个TCP连接是全双工的(即数据在两个方向上都能传递),因此每个方向都必须单独进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向上的连接。当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据传送。
如下图:
半关闭
TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。
如下图:
2MSL等待状态
TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL。它是任何报文段被丢弃前在网络内的最长时间。
为什么要有TIME_WAIT状态?
- 因为终止连接的一方发送的最后的一个ACK可能会丢失,另一端超时并重发最后的FIN, 这样终止连接的一方可以再次发送最后的ACK
为什么是2MSL?
- 最后一个ACK存在的时间最多为MSL,如果ACK丢失,然后接收端超时并重发FIN,这个FIN最多存在时间又是MSL,而TIME_WAIT状态需要等待这个连接中的所有分组都消失,所以需要等待2ML
- 2MSL时间后这个连接的所有分组都会消失,不会干扰到接下来相同socket对建立的连接。
TCP在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用,这个连接只能在2MSL结束后才能再被使用。如果我们终止一个已经建立连接的服务器程序,并试图立即重启这个服务器程序,服务器程序不能把它的这个熟知端口赋值给它的端点,因为那个端口是出于2MSL连接的一部分。
我们可以以-A标记来设置SO_REUSEADDR,这样可以使服务器程序使用之前的端口,但它不能主动打开之前的相同端口的客户程序,应为那个连接的插口对仍处于2MSL等待状态。但我们如果让那个客户程序来主动打开这个服务器程序是会成功的,因为大多数的伯克利实现支持一个新的连接请求到达仍处于TIME_WAIT状态的连接。
复位报文段
一般说来,无论何时一个报文段发往指定的连接出现错误,TCP都会发出一个复位报文段。
产生复位的几种常见情况是:
- 到不存在的端口的连接请求;
- 异常终止一个连接;
检测半打开连接。
如果一端已经关闭或异常终止连接而另一方却还不知道,我们将这样的连接成为半打开连接。同时关闭
两边都执行主动关闭也是有可能的,TCP协议也允许这样的同时关闭。
如下图:
部分问题
- 为什么服务器对客户FIN的ACK不和自己的FIN合并(即终止连接不是三次握手)?
因为发送客户FIN的ACK通常是收到FIN就立刻发送,但这是服务器不一定要关闭自己这端的连接,还可能需要发送数据(半关闭),所以不一定要发送FIN。 - 分析处于TIME_WAIT状态的主机收到使其进入此状态的重复的FIN时所发生的情况
发送ACK,重启定时器。
TCP连接建立和终止小结的更多相关文章
- 动手学习TCP:TCP连接建立与终止
TCP是一个面向连接的协议,任何一方在发送数据之前,都必须先在双方之间建立一条连接.所以,本文就主要看看TCP连接的建立和终止. 在开始介绍TCP连接之前,先来看看TCP数据包的首部,首部里面有很多重 ...
- TCP连接建立与终止,及状态转换
TCP连接建立 三路握手 三路握手发生在客户端发起connect请求到服务端accept返回中,在三路握手发生前,服务端必须准备好接受外来连接,这通常通过服务端调用 (socket.bind.list ...
- 关于TCP连接建立与终止那点事
0. 前言 最近在处理公司遗留项目的时候发现自己对TCP协议一点都不懂,所以补了点关于TCP连接的建立和终止的内容,这里简单写下自己了解的部分,省略了报文序号确认序号这些无关的字段,主要讨论TCP状态 ...
- 传输控制协议(TCP) -- 连接建立及终止过程
TCP简介 相对于不可靠.无连接的用户数据报协议(User Datagram Protocol, UDP),传输控制协议(Transmission Control Protocol, TCP)是可靠的 ...
- TCP连接建立和关闭中的疑难点
TCP连接建立和关闭中的疑难点 作者:夏语岚 撰写日期:2011-10-29 近日在阅读<Unix网络编程>,以前在<计算机网络>课程中学到TCP,当时只是简单了解了TC ...
- TCP连接建立与关闭
http://hi.baidu.com/psorqkxcsfbbghd/item/70f3bd91943b9248f14215cd TCP连接建立与关闭 TCP 是一个面向连接的协议,无论哪一方向另一 ...
- tcp、http 学习小结
tcp.http 学习小结 前言 最近因为cdn的一个问题,困扰了自己好久.因为需要统计网站访问的成功数,而且要求比较精确.目前的实现不能满足要求,因为没有区别访问成功与否,也没有对超时做处理.期间解 ...
- 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 《TCP/IP详解 卷一》读书笔记-----TCP连接建立
1.在每个TCP报文段中,头部的flag字段里的SYN,FIN,RST,PSH可以多个有效,并没有限定为必须只有一个 2.TCP连接建立过程: 1)客户端发送一个SYN报文段,其中包含了客户端要传送的 ...
随机推荐
- css权威指南-基本视觉格式化(水平与垂直)
1.基本概念 (1)正常流:是指西方语言文本从左向右,从上向下显示.如果要让一个元素不在正常流中国,唯一的办法 就是使之成为浮动或定位元素. ( ...
- js和jquery实现简单的选项卡
选项卡切换在做网页的时候经常会用到,以往都是用JQ来实现,代码简单易懂,今天用原生的js实现了一下,二者还是有很大不同的,可以对比一下代码来研究一下. <!DOCTYPE html> &l ...
- SQL Server-聚焦EXISTS AND IN性能分析(十六)
前言 前面我们学习了NOT EXISTS和NOT IN的比较,当然少不了EXISTS和IN的比较,所以本节我们来学习EXISTS和IN的比较,简短的内容,深入的理解,Always to review ...
- AngularJS开发指南11:AngularJS的model,controller,view详解
model model这个词在AngularJS中,既可以表示一个(比如,一个叫做phones的model,它的值是一个包含多个phone的数组)对象,也可以表示应用中的整个数据模型,这取决于我们所讨 ...
- fullpage.js全屏滚动插件使用小结
刚做好公司网站,通过全屏滚动,显著提高了官网的浏览体验.遂总结一下使用fullpage.js的方法.欢迎指正 一. fullpage.js简介 fullpage.js是一套实现浏览器全屏滚动的js插件 ...
- uploadify使用的一些经验总结
说说自己使用uploadify的一波三折的曲折过程: 之所以要选择uploadify,是源于自己先前使用过jQuery官网的上传文件插件,比较难用(页面写的代码比较多,IE下后台回传需要配置格式[不清 ...
- Java进击C#——开发环境
在进入本章之前.笔者想说一些话.对于笔者来讲语言没有好坏之分.只有适不适用之别.当上一篇发到首页的时候,我突然发现有可能会引发争论.这是笔者担心的,这也是笔者不想看到的. 笔者想写这一系列的原因不是为 ...
- (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...
- 初识Servlet
1.创建DispatcherServlet package myservlet; import java.io.IOException; import javax.servlet.ServletExc ...
- Linux网络查看命令
1.ifconfig 查看当前生效的网卡. 2.ifdown ifup 网卡禁用与启动. 3.netstat -tuln 查看当前tcp/udp通讯端口连接情况. 4.netstat -an 查看当前 ...