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二次开发】隐藏、显示对象UF_OBJ_set_blank_status
隐藏.显示对象用UF_OBJ_set_blank_status() 查看对象显示情况用UF_OBJ_ask_display_properties() 效果: 源码: #include "Te ...
- [Linux]经典面试题 - 网络基础 - TCP三次握手
[Linux]经典面试题 - 网络基础 - TCP三次握手 目录 [Linux]经典面试题 - 网络基础 - TCP三次握手 一.TCP报文格式 1.1 TCP报头 1.2 报文图例 二.TCP三次握 ...
- ES6中的Map
今天小编和大家一起探讨一下引用类型中的map,在其中会有一些map与数组联合应用,还有和map类似的weakmap类型的说明,这篇文章同时也增加了一些操作数组的办法和实际应用.大家也可以关注我的微信公 ...
- Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...
- .net core 支付宝,微信支付 一
源码: https://github.com/aspros-luo/Qwerty.Payment/tree/develop 支付宝支付:参考支付宝sdk及文档,https://docs.open.al ...
- 浅谈最长上升子序列(O(n*logn)算法)
今天GM讲了最长上升子序列的logn*n算法,但没讲思路... 我看了篇博客,发现-- 说的有道理!!! 首先,举例子: a[7]={1,2,4,3,6,7,5}(假设以1开头) 很明显,LIS=5: ...
- layui--入门(helloWorld)
具体可参考官方文档:https://www.layui.com/doc/ 由于引入layui 需要用到node.js 安装过程可参考: https://www.cnblogs.com/liuchenx ...
- Java实验项目三——面向对象定义职工类和日期类
Program:按照如下要求设计类: (1)设计一个日期类,用于记录年.月.日,并提供对日期处理的常用方法. (2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加 ...
- Kong的API管理方式
目录 Kong 的管理方式 1. kong的关键术语 Service: Route: Upstream: Target: API: Consumer: Plugin: 2. 如何通过配置KONG AP ...
- 学C记录(理解递归问题之汉诺塔)
汉诺游戏规则如下: 1.有三根相邻的柱子,标号为A,B,C. 2.A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘. 3.现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘 ...