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.接收到的数据包可以简单分成:小包.大包.跨包三种情况,根据这三种情况作相对应的拆包处理,示例如 ...
 
随机推荐
- UF_LAYOUT 布局相关
			
Open C uc6460uc6462uc6463uc6464 根据视图名称旋转视图,在布局中替换视图uc6466uc6467uc6468uc6469uc6470uc6471uc6472uc6473
 - Java显式锁
			
Java 显式锁. 一.显式锁 什么是显式锁? 由自己手动获取锁,然后手动释放的锁. 有了 synchronized(内置锁) 为什么还要 Lock(显示锁)? 使用 synchronized 关键字 ...
 - .NET Core/.NET5/.NET6 开源项目汇总1:常用必备组件
			
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
 - Jenkins+Github+Nginx实现前端项目自动部署
			
前言 最近在搭建一个自己的网站,网站框架搭好了要把项目放到服务器运行,但是每次更新网站内容就要手动部署一次,实在很麻烦,于是就想搭建一套自动化部署的服务.看了一些案例最后选用现在比较主流的Jenkin ...
 - SqlServer中offset..fetch 的使用问题
			
好久没更新了,最近忙的很,也生病了,重感冒,555~~~ 早上抽的一丝空闲,来讲讲SqlServer中的分页问题.其实用过了多种数据库,分页这问题已经是老生常谈的问题了.不管是开发什么类型的网站,只要 ...
 - Springboot WebFlux集成Spring Security实现JWT认证
			
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 在之前的文章<Springboot集成Spring Security实现JWT认证>讲解了如何在传统 ...
 - windows 安装Git详解
			
windows 安装Git详解 一.Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Lin ...
 - 深入浅出,遇见Windows Terminal(Windows终端器),体验及美化新一代终端神器
			
Windows Terminal 简介 Windows Terminal is a new, modern, feature-rich, productive terminal application ...
 - 利用C语言判别输入数的位数并正逆序输出
			
利用C语言判别用户输入数的位数并正逆序输出 #include <stdio.h> void main() { int i, scanfNum, printfNum, temp ...
 - 18.自动运维工具ansible
			
1 Ansible 介绍和架构 1.1 Ansible介绍 ansible 的名称来自科幻小说<安德的游戏>中跨越时空的即时通信工具,使用它可以在相距数光年的 距离,远程实时控制前线的舰队 ...