TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

Sequence number(顺序号码)

Acknowledge number(确认号码)

TCP报文头部

 
TCP建立连接
如上图所示 TCP建立连接的过程。 A是主动打开服务的,B是被动打开服务的
 
1.B的TCP服务器进程先创建传输控制块TCB(Transmission Control Block 存储了每个连接中的一些重要信息,如:TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接受序号,等),准备接收客户进程的连接请求,然后服务器进程就处于LISTEN状态,等待客户的连接请求.如有,就做出响应.
A的TCP客户进程也是先创建传输控制块,然后向B发出连接请求报文段,这时候首部中的同步位SYN=1,同时选择一个初始序号 seq=x。TCP规定,SYN报文段(SYN=1的报文段) 不能携带数据,但要消耗一个序号.这时,TCP客户进程进入SYN-SENT状态.
 
2.B收到连接请求报文段后,如同意建立连接,则向A发送确认.在确认报文段中,应把SYN和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,同样要消耗一个序号.这时TCP服务器进程进入SYN-RCVD(同步收到)状态.
 
3.TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,这种情况下,下一个数据报文段的序号仍是seq=x+1。这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
当B收到A的确认后,也进入ESTABLISHED状态。
 
为什么要有第三次确认?
这主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误.
假设没有客户端的第三次确认。A发送连接请求,但连接请求丢失而未收到B的确认,于是A重新发出了一次请求连接,后来B收到了请求,发出确认建立了连接,在完成通信后连接释放,成功完成一次通信。A虽发送了两次连接请求,但第一次丢失,第二次成功,所以此时不存在已失效的连接请求报文。现假设A第一次发送的连接请求报文因为网络问题长时间滞留了,到第二次通信完成释放连接后才到达B,这就是一个已失效的报文,但此时B以为是A的又一次连接请求,于是发出了确认,若没有第三次确认,连接就成功建立了。由于A现在并没有发出建立请求,所以B回复的确认A不理睬,所以不与B进行通信,然而B就一直等着A发数据给他,就这样,B傻乎乎的等了很久,白白浪费了自己的青春(B的资源)。
 
 
TCP释放连接
1.数据传输结束后,通信双方都可释放连接。现在A,B都处于ESTABLISHED状态。A先发送连接释放报文段,并停止在发送数据,主动关闭TCP连接。A把连接释放报文段首部离得FIN置1,其序号seq=u,u等于前面已发送的数据的最后一个字节的序号加1.这是A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,也消耗一个序号。
2.B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已发送的数据的最后一个字节的序号加1.然后B进入CLOSE-WAIT(关闭等待)状态。至此A->B的连接就释放了,这时TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但B若发送数据,A仍然接收。
3.A收到B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。若B已经没有数据要发给A,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1.假定B的序号是w(在半关闭状态B可能又发送了一些数据)。B还必须从夫上次已发送过的确认号ack=u+1。这时B进入LAST-ACK状态,等待A确认。
4.A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,自己的序号为seq=u+1(前面发送的FIN报文段要消耗一个序号)。然后进入TIME-WAIT(时间等待)状态。现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAIT
timer)设置的时间2MSL后,A才进入到CLOSED状态。(MSL:Maximum Segment Lifetime
最长报文段寿命)
 
为什么在TIME-WAIT要等待呢?
1.为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段可能丢失,因而使处在LAST-ACK状态的B收不到确认。B会超时重传FIN+ACK报文段,A就能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重启计时器。最好,AB都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间,而是再犯送完ACK报文后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会在发送一次确认报文。这样,B就无法按照正常步骤进入CLOSED状态。
2.防止 已失效的连接请求报文出现在本连接中。
 

http://blog.chinaunix.net/uid-26413668-id-3376762.html

TCP三次握手四次分手的更多相关文章

  1. 对TCP三次握手四次分手还不清楚的速度进,超简单解析,明白了就很好记!

    关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 先上个TCP三次握手和四 ...

  2. 对TCP三次握手四次分手还不清楚,超简单解析

      关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 先上个TCP三次握手 ...

  3. TCP三次握手四次分手—简单详解

    关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 疑问一,上图传递过程中出 ...

  4. Tcp 三次握手 四次分手

    看了 余晟以为的 “tcp没那么难吧”,算是对三次握手,四次分手有了一点点理解,记录下来以方便自己以后的查看. 原文链接:https://mp.weixin.qq.com/s?__biz=MzA3MD ...

  5. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  6. TCP三次握手四次断开

    今天被问到三次握手了,当时只是脑子里有印象,却忘了一些SYN细节,手动微笑. 这么下去还怎么混...赶紧复习个... 三次握手是什么? TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双 ...

  7. (转)TCP三次握手四次挥手

    转自:http://www.jellythink.com/archives/705 参考:http://blog.csdn.net/whuslei/article/details/6667471 [注 ...

  8. Tcp三次握手四次挥手个人学习

    最近想跳槽,学习了tcp中的三次握手与四次挥手,特意记录下,加深记忆 SYN 代表请求创建连接 FIN 表示请求关闭连接 ACK 代表确认接受,不管是三次握手还是四次分手,在回应的时候都会加上ACK= ...

  9. TCP三次握手/四次挥手详解

    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...

随机推荐

  1. Tensorflowonspark安装

    1.实验环境 Centos7+Python3.6+Java8+Hadoop2.6+Spark2.3+Tensorflow1.10.0 2.Tensorflow安装 最简单的方式:pip install ...

  2. 【iOS开发】IOS界面开发使用viewWithTag:(int)findTag方法获取界面元素

    http://blog.csdn.net/lxp1021/article/details/43952551 今天在开发OS界面的时候,遇到通过界面UIview viewWithTag:(int)fin ...

  3. lintcode-64-合并排序数组 II

    64-合并排序数组 II 合并两个排序的整数数组A和B变成一个新的数组. 注意事项 你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素. 样例 给出 A = [1, 2, 3, ...

  4. http短连接大量time wait解决方案

    tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为“长连接”和“短连接”,长短连接的优点和缺点这里就不详细展开了,有心的同学直接去google查询,本文主要关注如何解决tcp短连接 ...

  5. 【转】C++ const用法 尽可能使用const

    http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不 ...

  6. tomcat 启动报错 解决办法 A child container failed during

    控制台报错: Caused by: org.apache.catalina.LifecycleException: A child container failed during start at o ...

  7. capacilitys docker中的权限设置 privileged

    capacilities是docker 中对docker权限设置的重要方面: http://blog.csdn.net/wangpengqi/article/details/9821227 上面这篇文 ...

  8. Java基础知识-去重

    java基础知识-去掉list集合中的重复元素: 思路: 首先新建一个容器resultList用来存放去重之后的元素 然后遍历sourceList集合中的元素 判断所遍历的元素是否已经存在于resul ...

  9. android 与 小米1S刷机学习

    本文内容为本博客作者原创,转载请注明出处或者发私信. [名词] 1.ROM包 :安卓手机系统,以.ZIP结尾,类似windows的 win7系统包,300M-700M不止 2.卡刷(Recovery模 ...

  10. [洛谷P1401]城市

    题目大意:有$n(2\leqslant n\leqslant200)$个城市,$m(1\leqslant m\leqslant40000)$条无向边,你要找$T(1\leqslant T\leqsla ...