TCP协议是一种面向连接的、可靠的流协议。

流即不间断的数据结构。这样能够保证接收到数据顺序与发送相同。但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度或间隔的字段信息。

由于TCP为应用提供可靠传输,所以需要对数据传输时数据破坏、丢包、重复以及乱序问题有充分的控制能力。同时TCP协议作为面向连接的协议,只有确认对端存在才会发送数据。

TCP通过检验和、序列号、确认应答、重发控制、连接管理、窗口控制等实现可靠传输。

当传输层采用TCP协议进行通信时,TCP数据被封装在一个IP数据报里,首先来看一下TCP首部的构成,不包括可选字段,TCP首部一般是20个字节:

看书的时候把首部各部分的意义画在了图中,简单来说,TCP数据报通过源端端口号和目的端口号来确认彼此使用TCP的程序,序号和确认序号用于完成字节流的标识,使其能够按照发送的顺序被接收。窗口大小指的是滑动窗口协议的大小,检验和用来检验当前收到的数据包是不是有应该收的。具体我都在看书过程中画在图里了。

TCP是面向连接的可靠传输,在每次通信之前都需要先建立链接,建立一个新连接的时候:

  • 请求端(客户端)发送一个SYN段指明建立连接的端口,此时TCP首部中,SYN字段被设置为1,序号字段是一个随机生成的初始序号(ISN),可选字段中会有一个己方能够发送的数据包最大长度MSS
  • 服务器收到这个报文之后,发送一个ACK给客户端,这个数据包中,ACK和SYN字段被设置为1,序号字段是一个随机生成的初始序号(与客户端的不同),确认序号字段是客户端的ISN+1,可选字段有一个服务器所能够发送的MSS
  • 客户端接收到这个报文之后,发送一个ACK给服务器,这个数据包中,ACK字段为1,确认序号为服务器的ISN+1

MSS的确认是建立连接的过程中实现,但是如果有一方不接收来自另一方的MSS,则设定为默认值536(这个默认值允许20字节的IP首部以及20字节的TCP首部以适合576字节的IP数据报)

在通信结束之后,需要经过4次挥手断开链接(这是由TCP的半关闭造成的),在这个过程中,第一个发送FIN的执行主动关闭,另一方执行被动关闭。当客户端结束数据传输,给对方发送一个FIN数据包请求关闭链接,,服务器收到FIN后回复一个ACK。而后服务器再给客户端发送一个FIN请求关闭链接,客户端回复一个ACK,即可完成关闭。

附图:TCP/IP详解(注意建立连接与关闭链接中双方的序号关系,起始ISN是随机产生的)

在建立连接与断开链接的过程中,有一个非常重要的问题,就是丢包处理。一般会设置一个最长等待时间,当发送方超过最长等待时间接收不到对方回复,就会重发刚才的数据包。而接收方如果接到数据包,会根据序号(或其他策略)判断是不是重复的数据包从而接收或者丢弃。

还有很重要的在建立连接与关闭链接过程中,TCP的状态变迁:

  • TIME_WAIT状态也称为2MSL等待状态,MSL是任何报文段被丢弃前在网络内存活的最长时间。当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留时间为2倍的MSL,这样可以让TCP再次发送最后的ACK防止ACK丢失。另外,谁执行主动关闭,谁进入TIME_WAIT状态,谁被动关闭,谁进入CLOSE_WAIT状态
  • FIN_WAIT_2状态,是已经发出FIN并且另一端已经确认,除非实行半关闭,否则等待另一端发送FIN请求关闭链接。只有当另一端的进程完成这个关闭,这端才会从FIN_WAIT2状态进入TIME_WAIT状态

TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开的更多相关文章

  1. “三次握手,四次挥手”你真的懂吗?TCP

    “三次握手,四次挥手”你真的懂吗?  mp.weixin.qq.com 来源:码农桃花源 解读:“拼多多”被薅的问题出在哪儿?损失将如何买单? 之前有推过一篇不错的干货<TCP之三次握手四次挥手 ...

  2. 你应该这么理解TCP的三次握手和四次挥手

    前言: TCP协议是计算机的基础,他本身是一个非常非常复杂的协议. 本文只是蜻蜓点水,将从网络基础以及TCP的相关概念介绍开始,之后再将三次握手,四次挥手这些内容来阐述. 最后介绍一些常见问题,并给出 ...

  3. TCP协议三次握手与四次挥手详解

    在计算机网络的学习中TCPi协议与Http协议是我们必须掌握的内容,其中Tcp协议属于传输层,而Http协议属于应用层,本博客主要讲解Tcp协议中的三次握手与四次挥手,关于Http协议感兴趣的可以参看 ...

  4. TCP/IP协议三次握手和四次挥手大白话解说

    前言 昨天晚上被一位师傅问到了TCP/IP的工作机制,心里很清楚三次握手,然而对于四次挥手却忘了,这是大学习里学过的,奋而翻阅书籍和网络对之前所学的做一个温顾,算是夯实自我吧. TCP(Transmi ...

  5. 学习 TCP 三次握手和四次挥手

    TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...

  6. TCP协议详解7层和4层解析(美团,阿里) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌握

    如果想了解HTTP的协议结构,原理,post,get的区别(阿里面试题目),请参考:HTTP协议 结构,get post 区别(阿里面试) 这里有个大白话的解说,可以参考:TCP/IP协议三次握手和四 ...

  7. TCP协议--TCP三次握手和四次挥手

    TCP三次握手和四次挥手 TCP有6种标示:SYN(建立联机) ACK(确认) PSH(传送) FIN(结束) RST(重置) URG(紧急) 一.TCP三次握手   第一次握手 客户端向服务器发出连 ...

  8. TCP的三次握手与四次挥手笔记

    TCP的三次握手与四次挥手笔记 TCP Flags URG: 紧急指针标志 ACK:确认序号标志 PSH:push标志 RST:重置连接标志 SYN:同步序号,用于建立连接过程 FIN: finish ...

  9. 跟着动画学习 TCP 三次握手和四次挥手

    TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...

随机推荐

  1. 【目录】processing

    Processing 小代码 小代码2 小代码3 小代码4 小代码5

  2. IOS 非ARC开发内存管理的几条规则

    关于ios内存管理.在开发过程中,内存管理很重要,我简单说明一下. 1.正确用法 UIView *v = [[UIView alloc] init]; //分配后引用计数为1 [self.view a ...

  3. JS && JSON

    将Json字符串转为Json对象以下3种方式: eval('(' + str + ')'); JSON.parse(str); jQuery.parseJSON(str): 将Json对象转为字符串: ...

  4. mysql缓存

    <cache/>字面上看就是这样.这个简单语句的效果如下: 映射语句文件中的所有 select 语句将会被缓存. 映射语句文件中的所有 insert, update 和 delete  ...

  5. JAVA Day10

      使用继承 编写继承: class Engineer{ //公共的属性和方法 }   编写子类,继承父类, class SoftEnineer extends Enginerr{ //子类持有的属性 ...

  6. 解决rand()伪随机数

    利用time改变种子 例: #include <stdlib.h> #include <stdio.h> #include <time.h>//使用当前时钟做种子 ...

  7. SubSonic指南中文版

    翻译:王鹏程张原 王伟策划:毛凌志2009年1月北京工业大学软件学院PS:有问题反馈至http://lexus.cnblogs.comGetting Started with SubSonicBy S ...

  8. Sizeof面试题

    sizeof()功能:计算数据空间的字节数1.与strlen()比较      strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素.       ...

  9. android PreferenceFragment

    初始化: public SettingPreferenceFragment() { } public void setArguments(Bundle bundle){ String targetId ...

  10. SqlServer禁用启用触发器、外键约束

    --禁用指定名称触发器 ALTER TABLE tbname DISABLE TRIGGER trigname --恢复指定名称触发器 ALTER TABLE tbname ENABLE TRIGGE ...