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. win10预览版9926升级10049操作步骤

    文章转自:豆豆系统收藏备用 win10预览版系统安装的用户非常多,现在最新版本已经到了10049,但是之前很多装了9926版本或者10041版本的同学在通过系统自动更新的时候,且发现,微软官方提供的速 ...

  2. PyCharm LicenseServer 破解

    在自己的云平台上部署了IntelliJIDEALicenseServer服务,理论上http://www.jetbrains.com的产品都可以使用,不过目前只测试了PyCharm. 大家也知道,Py ...

  3. Android 某些配置记录

    1, system image 大小配置: devices/intel/baytrail/ffrd8/BoardConfig.mk :  BOARD_SYSTEMIMAGE_PARTITION_SIZ ...

  4. nginx,apache,tomcat配置https的阿里提供的文档

    安装证书 ( 1 ) 打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,找到 # HTTPS server # #server { # listen 443; # serv ...

  5. intellij idea 插件 ideaVim 用法

    intellij idea 插件 ideaVim - Genji_ - 博客园http://www.cnblogs.com/nova-/p/3535636.html IdeaVim插件使用技巧 - - ...

  6. CodeTimerPerformance EasyPerformanceCounterHelper .NET 4.5

    //#define NET35 namespace TestConsoleApplication { using System; using System.Diagnostics; using Sys ...

  7. T-SQL 基础学习 02

    数据库设计 定义 数据库设计就是将数据库中的数据实体以及这些数据实体之间关系,进行规划和结构化的过程 在需求分析阶段,设计数据库的一般步骤 A. 收集相信 B. 标识实体 C. 标记每个实体需要存储的 ...

  8. 廖雪峰js教程笔记13 插入DOM

    当我们获得了某个DOM节点,想在这个DOM节点内插入新的DOM,应该如何做? 如果这个DOM节点是空的,例如,<div></div>,那么,直接使用innerHTML = '& ...

  9. HTML5离线Web应用实战:五步创建成功

    [IT168 技术]HTML5近十年来发展得如火如荼,在HTML 5平台上,视频,音频,图象,动画,以及同电脑的交互都被标准化.HTML功能越来越丰富,支持图片上传拖拽.支持localstorage. ...

  10. 关于在程序中 文件新生成 在用os.system()程序对新生成的文件处理 举个栗子 如下:

    print 'save to ',savedir+os.sep+d["FILE_NAME"]                ff = open(savedir+os.sep+d[& ...