TCP通信简单梳理
一、什么是TCP协议
TCP协议是一种面向连接的可靠的通信协议,最重要的两个特点:连接、可靠。
二、TCP是如何进行通信的
TCP通过三次握手建立连接后客户端服务端的内核都分别开辟资源,这时候开始进行数据传输,最终通过四次挥手断开连接,释放资源,整体流程如下:

1、三次握手
三次握手流程如下:
1)客户端向服务端发送SYN包告诉服务端我的初始序列号为X;
2)服务端接收后回复ACK包表示我收到了;
3)服务端也通过一个SYN包告知客户端我的序列号为Y;
4)客户端收到后回复服务端ACK包表示我也收到了。
从上面的流程上可以看出来,三次握手就是为了让客户端、服务端都能确认自己能发数据也能收数据即自己的输入输出是正常的,这时有人可能问了那应该四次握手啊?
这是因为实际应用中为了减少客户端与服务端直接交互次数,将服务端发送ACK包和SYN包合并处理,因而最终只需交互三次即可建立连接。
2、数据传输
TCP是一种可靠的传输协议,那么它可靠在哪呢?—— 确认机制。在数据传输过程中每一次数据包的传递都需要发送ACK包进行确认,通过这样的方式确保每一次传输都是可靠的。
3、四次挥手
由于连接的资源总是有限的,所以当数据传输完毕我们需要关闭连接由于TCP是全双工的,所以要断开连接,两边都需要拆除连向对端的通信信道,所以四次挥手流程如下:
1)客户端发送一个 FIN 包来告诉服务端我已经没数据需要发送了;
2)服务端收到后回复一个 ACK 确认包说我知道了;
3)然后服务端在自己也没数据发送给客户端后,服务端也发送一个 FIN 包给客户端告诉客户端我也已经没数据发送了;
4)客户端收到后,就会回复一个 ACK 确认包说我知道了。
下面通过一个实际例子进行展示,我们通过tcpdump进行抓包,详细看下整个tcp通信过程。
首先通过如下命令监听80端口:
yangye@test:~$ sudo tcpdump -nn -i ens33 port 80
[sudo] password for yangye:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
接着我们通过curl请求百度首页:
curl www.baidu.com
我们来看一下抓包情况:
# 客户端发送SYN包
07:59:59.841169 IP 172.16.194.129.58766 > 110.242.68.3.80: Flags [S], seq 3215627872, win 64240, options [mss 1460,sackOK,TS val 1796006028 ecr 0,nop,wscale 7], length 0
# 服务端返回ACK和SYN包
07:59:59.944579 IP 110.242.68.3.80 > 172.16.194.129.58766: Flags [S.], seq 2542675112, ack 3215627873, win 64240, options [mss 1460], length 0
# 客户端发送ACK包,这时三次握手结束,连接建立
07:59:59.944614 IP 172.16.194.129.58766 > 110.242.68.3.80: Flags [.], ack 1, win 64240, length 0
# 客户端请求首页
07:59:59.945103 IP 172.16.194.129.58766 > 110.242.68.3.80: Flags [P.], seq 1:78, ack 1, win 64240, length 77: HTTP: GET / HTTP/1.1
# 服务端确认收到请求
07:59:59.945488 IP 110.242.68.3.80 > 172.16.194.129.58766: Flags [.], ack 78, win 64240, length 0
# 服务端返回数据包
07:59:59.968917 IP 110.242.68.3.80 > 172.16.194.129.58766: Flags [P.], seq 1:2782, ack 78, win 64240, length 2781: HTTP: HTTP/1.1 200 OK
# 客户端确认收到
07:59:59.968955 IP 172.16.194.129.58766 > 110.242.68.3.80: Flags [.], ack 2782, win 62780, length 0
# 客户端告诉服务端我要关闭连接
07:59:59.970750 IP 172.16.194.129.58766 > 110.242.68.3.80: Flags [F.], seq 78, ack 2782, win 62780, length 0
# 服务端返回ACK
07:59:59.970959 IP 110.242.68.3.80 > 172.16.194.129.58766: Flags [.], ack 79, win 64239, length 0
# 服务端告诉客户端它也要关闭连接
07:59:59.993361 IP 110.242.68.3.80 > 172.16.194.129.58766: Flags [FP.], seq 2782, ack 79, win 64239, length 0
# 客户端返回ACK
07:59:59.993397 IP 172.16.194.129.58766 > 110.242.68.3.80: Flags [.], ack 2783, win 62780, length 0
TCP通信简单梳理的更多相关文章
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
- python--教你做个最简单的tcp通信。。
TCP协议:建立在IP协议之上的,TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由I ...
- RocketMQ 简单梳理 及 集群部署笔记【转】
一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...
- 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版
目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- 异步tcp通信——APM.Server 消息推送服务的实现
消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...
- 异步tcp通信——APM.ConsoleDemo
APM测试 俗话说麻雀虽小,五脏俱全.apm虽然简单,但是可以实现单机高性能消息推送(可以采用redis.kafka等改造成大型分布式消息推送服务器). 测试demo: using System; u ...
- 异步tcp通信——APM.Core 解包
TCP通信解包 虽说这是一个老生长谈的问题,不过网上基本很少见完整业务:或多或少都没有写完或者存在bug.接收到的数据包可以简单分成:小包.大包.跨包三种情况,根据这三种情况作相对应的拆包处理,示例如 ...
随机推荐
- 【NX二次开发】Block UI 角度尺寸
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- 设置NX欢迎界面
环境变量 变量名:UGII_WELCOME_PAGE 变量值:http://www.baidu.com/
- TensorFlow入门实操课程第一章练习笔记
在本练习中,您将尝试构建一个神经网络,让它根据一个简单的公式来预测房屋的价格. 想象一下,如果房子的定价很简单,带一间卧室的房子价格是5万+5万,那么一间卧室的房子要花10万元:两间卧室的房子就要花1 ...
- 题解 P3605 [USACO17JAN]Promotion Counting P
分块\(yyds\) ----关于线段树合并的题我用分块过掉这件事 题目传送门 先说正解 正解当然是线段树合并等一类做法了 至于解析...出门右转题解区第一篇 (就是他让我看不懂,然后用分块打的\(Q ...
- Scala语言笔记 - 第三篇(容器方法篇)
Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...
- 『无为则无心』Python基础 — 7、Python的变量
目录 1.变量的定义 2.Python变量说明 3.Python中定义变量 (1)定义语法 (2)标识符定义规则 (3)内置关键字 (4)标识符命名习惯 4.使用变量 1.变量的定义 程序中,数据都是 ...
- Hive和Spark分区策略
1.概述 离线数据处理生态系统包含许多关键任务,最大限度的提高数据管道基础设施的稳定性和效率是至关重要的.这边博客将分享Hive和Spark分区的各种策略,以最大限度的提高数据工程生态系统的稳定性和效 ...
- Ubuntu18.04 LTS x64 构建ARM交叉编译环境(尝试,但失败了!!!估计是编译器没选对)
[测试而已,由于需要了解编译器和处理器体系,因此先放弃该方法] 动机 入门嵌入式开发,又需要 Windows 又需要 Linux,但资料给的竟然是 Ubuntu9,导致我不能使用 VSCode Rem ...
- CRM系统对管理客户的帮助
我们可以把客户关系看做是一种长期的投资,在资源有限的基础上,把人力财力物力放到那些能够持续创造价值的客户身上,从而为企业带来源源不断的收益.通过进行客户关系管理,能够让企业与客户之间建立沟通的渠道,形 ...
- Https:SSL双向认证机制(理论知识)
1.基础知识 这部分内容主要解释一些概念和术语,最好是先理解这部分内容. 1.1.公钥密码体制(public-key cryptography) 公钥密码体制分为三个部分,公钥.私钥.加密解密算法,它 ...