上一篇讲解了http协议,本篇中主要讲解TCP协议

TCP介绍

TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

TCP通信需要经过创建连接、数据传送、终止连接三个步骤。

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,“打电话”"

TCP特点

面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

双方间的数据传输都可以通过这一个连接进行。

完成数据交换后,双方必须断开此连接,以释放系统资源。

这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

可靠传输
  • TCP采用发送应答机制

    TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

  • 超时重传

    发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

    TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

  • 错误校验

    TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  • 流量控制和阻塞管理

    流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP与UDP的不同点

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

TCP通信模型

TCP的三次握手

上图反映了TCP的三次握手,

  • 客户端: 首先客户端发送一个 syn类型数字 (比如 seq=3) 到服务器
  • 服务器: 服务器收到seq=3后 把数字加1,并变换类型为ack.。把ack类型的seq=4返回到客户端,同时服务器也发送一个syn类型的数字 (比如 seq=8)到客户端。
  • 客户端: 客户端收到ack类型seq=4和syn类型的seq=8后,把seq=8数字加1类型转换为ack。 然后把ack类型的seq=9发送给客户端。

TCP的四次挥手

  • 客户端: 调用close方法, 发送一个请求通知服务器,自己不再发送数据
  • 服务器: 收到客户端的通知,然后发送也一个相应给服务器,表示自己已经收到通知。
    然后调用自己receive的close()准备停止接受该客户端数据。
  • 服务器: 已经正确的调用了close()方法,并发送一个通知客户端 ,自己不再接收该客户端的数据
  • 客户端: 收到服务器的通知后,再次发送一个通知给服务器,自己不再接收服务器的数据
  • 服务器: 收到客户端的通知后,不再向该客户端发送数据


一篇文章完全掌握TCP协议相关推荐

  1. 超硬核!!!一篇文章搞定TCP、UDP、Socket、HTTP(详细网络编程内容+现实解释三次握手四次挥手+代码示例)【网络编程 1】

    TCP.UDP.Socket 一天面试的经验: 什么是网络编程 网络编程中两个主要的问题 网络协议是什么 为什么要对网络协议分层 计算机网络体系结构 1 TCP / UDP 1.1 什么是TCP/IP ...

  2. 一篇文章搞清楚直播协议RTMP

    说起RTMP协议,相信很多人都比较陌生,这个协议相对HTTP.HTTPS.TCP等我们常见的协议而言,我们在工作中确实较少接触它,但是对现在如火如荼的直播行业,RTMP是一个重要的协议,它在实时音视频 ...

  3. Chapter 22 UDP and TCP 第二十二章UDP和TCP协议作业

    Question 2 How is the well-known port different from an ephemeral port? 著名端口与临时端口之间的区别是什么? Answer:th ...

  4. 转载:一篇文章看明白 Android 系统启动时都干了什么

    最近在看<深入理解Android内核设计思想>,老实说,作为教材,这本书实在写的不好.本来内核的东西就比应用层繁杂,需要有个条绳子牵着,有个框子框着才不好跟丢.这个书老是在章节开头抛出一些 ...

  5. 2.3W字,这可能是把Nginx讲得最全面的一篇文章了,建议收藏备用

    前言 Nginx 概述 Nginx 特点 Nginx 作用 Nginx 安装 Nginx 常用命令 Nginx 核心配置 配置文件结构 配置文件 main 段核心参数 配置文件 events 段核心参 ...

  6. 【JavaEE】TCP协议的十大原理保姆讲解(Transmission Control Protocol)

    博主简介:想进大厂的打工人 博主主页:@xyk: 所属专栏: JavaEE初阶 上一篇文章讲了UDP协议,那么这篇文章我来讲讲TCP协议,TCP协议相对UDP协议难一些,内容相对更多. TCP,即Tr ...

  7. android 网络通信方式,Android中基于TCP协议的网络通信

    一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...

  8. 一篇文章看明白 Android PackageManagerService 工作流程

    Android - PackageMangerService 分析 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 ...

  9. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制

    概述 最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而 ...

最新文章

  1. 昆虫基因组DNA的优化提取,可进行长读测序
  2. 《JavaScript设计模式与开发实践》模式篇(5)—— 观察者模式
  3. python怎么导入图片_python怎么导入图片资源
  4. Scikit-learn 数据预处理之标准化StandardScaler
  5. ORACLE多条件的统计查询(case when)
  6. 11月 北京 | 高性能之GPU CUDA 3天密集式进阶课程
  7. oracle 执行sql路径,如何指定 SQL 执行路径
  8. Binder框架在Framework层的C++中的使用
  9. iOS:选择器控件UIPickerView的详解和演示
  10. 51单片机学习历程---单片机入门
  11. 图像数字水印技术研究及matlab实现,基于MATLAB的数字水印技术研究
  12. Struts2拦截器详解
  13. C盘爆红,一个操作将微信缓存踢走
  14. python解析mht文件_请教怎么解析.mht文件为html文件
  15. 【CSS3学习笔记】16:边框图片效果
  16. 车辆动力学知识总结(二):运动学模型
  17. uniapp 实时定位(系统、后台运行、支持息屏)插件 Ba-Location
  18. 一个老病号对感冒发烧的经验
  19. android 填充内存方法,安卓快速填满手机内存(转载)
  20. POST、GET请求及对应的参数获取

热门文章

  1. 怎么开电子处方才可以买到处方药
  2. 使用urillb获取北京公交线路信息
  3. Unity 安卓环境下保持设备屏幕唤醒
  4. MySQL表记录检索
  5. cuzysdk的起源-手机淘宝客sdk
  6. Leetcode 1370. Increasing Decreasing String
  7. 战地三服务器找不到了,战地3进不了游戏怎么办_战地3处理PunkBuster(PB)不能进游戏问题_快吧单机游戏...
  8. javascript slice( ) 方法
  9. 男女有别?读《火星金星》有感
  10. Prisma(二)——Existing database