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. October 18th, Week 43rd Tuesday, 2016

    Live as if you were to die tomorrow. 将每一天都当作人生的最后一天来活. If I were to die tomorrow, I may choose to en ...

  2. 模拟搭建Web项目的真实运行环境(三)

    一.解决Redis出现的RDB权限问题 当你在安装redis的时候,如果是使用超级用户root安装, 开启redis服务的时候没有用超级用户去开启, 在用客户端登录redis,然后使用shutdown ...

  3. Hotaru's problem(hdu 5371)

    题意:给出一个数字串,询问最长的子串,满足以下要求:将子串平均分为三部分,一三部分相等,一二部分对衬. /* 在manachar的基础上,枚举回文串的中心,再找第三部分. */ #include< ...

  4. SQL入门语句之LIKE、GLOB和LIMIT

    一.SQL入门语句之LIKE LIKE用来匹配通配符指定模式的文本值.如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1.这里有两个通配符与 LIKE 运算符一起使用,百 ...

  5. C++ 基础知识复习(三)

    43. 继承的几种方式: 答:共有继承public,保护继承protected,私有继承private.其中后两种继承会改变原有的访问级别. 44. 深复制与浅复制: 答:简单理解,深复制自己申请了内 ...

  6. MIT 6.828 JOS学习笔记9. Exercise 1.5

    Lab 1 Exercise 5 再一次追踪一下boot loader的一开始的几句指令,找到第一条满足如下条件的指令处: 当我修改了boot loader的链接地址,这个指令就会出现错误. 找到这样 ...

  7. java单例模式详解

    饿汉法 饿汉法就是在第一次引用该类的时候就创建对象实例,而不管实际是否需要创建.代码如下: public class Singleton { private static Singleton = ne ...

  8. featherview模板引擎

    1.判断语法 <?php if(isset($value['fromVR']) && !empty($value['fromVR'])) {?> <s class=& ...

  9. SecureCRT 使用 rz 和 sz 命令

    1.下载软件 rzsz-3.34.tar.gz,登录linux,用命令 wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载. 2.解 ...

  10. python操作日期和时间的方法

    不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...