TCP三次握手和四次断开
TCP,一个大家都熟悉的协议,对于技术人员来说,透彻的理解他,就到代表咱们的半只脚已经踏进了IT的大门。
TCP的特点
TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着是一对一的连接(通常是一个客户端连接一个服务端),在交换数据之前,需要先建立连接。在TCP的连接中,仅有一对一的双方建立连接,多播和广播不属于TCP的连接。
TCP保证其可靠性的机制
应用数据被分割成TCP认为最适合发送的数据块。由TCP传递给IP的信息单位称为报文段或段(segment)。
超时重传策略。当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒.
TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。
如果收到段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
既然TCP报文段作为IP数据报来传输,而 IP数据报的到达可能会失序,因此 TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
TCP还能提供流量控制。 TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
(可参见《TCP/IP详解卷一》)
TCP一些属性说明
端口号:
每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加
上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。
网络套接字(socket):
一个IP地址和一个端口号也称为一个socket。它也作为表示伯克利版的编程接口,socket包含客户IP地址、客户端口号、服务器IP地址和服务器端口号的四元组,可唯一确定互联网络中每个TCP连接的双方。
全双工:
TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连
接的每一端必须保持每个方向上的传输数据序号。
当我们在Linux系统中使用tcpdump时可以看到一些数据的传输信息,这包含了TCP数据包的一些报头信息:
1
2
3
4
|
# tcpdump -i eth0 '(( host 192.168.1.210) and ( port 80))'
13:30:19.078214 IP 192.168.1.106.53190 >192.168.1.210.http: Flags [S], seq 1725365454, win 8192, options [mss1460,nop,wscale 8,nop,nop,sackOK], length 0
13:30:19.078342 IP 192.168.1.210.http >192.168.1.106.53190: Flags [S.], seq 4163517334, ack 1725365455, win 14600,options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
13:30:19.078649 IP 192.168.1.106.53190 >192.168.1.210.http: Flags [.], ack 1, win 68, length 0
|
上面为一次三次握手建立连接的过程。
其中,格式为: 原地址 > 目的地址 : 标示,[S]标示SYN, 其中win表示窗口大小,也就是数据量的大小,可以用于流量控制,默认为4096,最大为65535,它是由一个16bit的字段表示的。
SYN: 同步序号连接标示,用来发起一个连接。
ACK: 应答标示,用来确认同步序号有效。
FIN:结束连接标示。
TCP三次握手过程
TCP的三次握手过程其实可以用一个简单的图表示:
连接过程:
请求端(通常为客户端)发送一个SYN段的请求,指明了客户端打算连接的服务的端口以及初始序号ISN,假设这个把报文段为SYN0.
服务器发回包含服务端的初始序号的SYN报文段(SYN1)作为应答,同时在请求端发送的SYN上加1,以ACK的方式返回进行确认。之所以会加1是因为一个SYN将占用一个序号。
客户端必须将确认序号设置为服务端的ISN加1返回一个ACK,以对服务器端SYN报文进行确认.
这样就建立了连接。
这一个简单的过程可以理解为,你去商店买东西.
你向服务员发起一个请求,说:我要xxx,请你把它给我(SYN0);
服务员说:好的我已经收到你的请求(SYN1)您要的是xxx对吧(ACK=SYN0+1);
你说:是的(Ack).
然后你们就开始进行交易。
TCP 四次断开过程
建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由TCP的半关闭(HALF-CLOSE)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方
向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止
这个方向连接。当一端收到一个FIN,它必须通知应用层另一端几经终止了那个方向的数据传
送。发送FIN通常是应用层进行关闭的结果。
四次断开的图示如下:
断开的过程:
当有一方要终止连接时,会向对方发送一个FIN的信号n.
接受方收到信息后,会回复一个ACK(n+1)表示已经收到请求,但此时并不会立即中断连接,而是去尝试关闭自身的连接。
当响应客户端关闭本地的TCP连接之后,会向请求端重新发送一个新的FIN m,表示此事响应端可以关闭。
请求端接受到FIN m的信号后,回复一个ACK,同时自己也进入TIME_WAIT状态,而响应端进入close状态。
这里应用TCP/IP协议卷的一张图,说明了主机在TCP交互过程中状态的变化:
其实这些内容只是TCP协议的冰山一角,在这个交互过程中还有很多算法和协议规则,具体的细节大家可以参考TCP/IP协议卷。
本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1795450
TCP三次握手和四次断开相关推荐
- TCP三次握手与四次断开
第一次握手:建立连接时,客户端发送Syn包(syn=j)到服务器,并进入syn_send状态,等待服务器确认 第二次握手:服务器收到Syn包,必须确认客户端的syn(ack=j+1),同时自己也发送一 ...
- 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
来自:小林coding 每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 T ...
- 握手失败_拜托了,看完这篇别再问我什么是TCP三次握手和四次挥手
TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 三次握手如何建立连接? 三次握手建立链接 从图中可以清楚的看到, ...
- 网络协议-网络分层、TCP/UDP、TCP三次握手和四次挥手
网络的五层划分是什么? 应用层,常见协议:HTTP.FTP 传输层,常见协议:TCP.UDP 网络层,常见协议:IP 链路层 物理层 TCP 和 UDP 的区别是什么 TCP/UDP 都属于传输层的协 ...
- TCP三次握手、四次挥手、socket,tcp,http三者之间的区别和原理
接着上一篇文章叙述: TCP/IP连接(在互联网的通信中,永远是客户端主动连接到服务端): 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协 ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
转自即时通讯网:http://www.52im.net/ 1.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道"三次"和&quo ...
- 图解TCP三次握手和四次挥手!(简单易懂)
哈喽:亲爱的小伙伴,首先祝大家五一快乐~ 本来打算节日 happy 一下就不发文了,但想到有些小伙伴可能因为疫情的原因没出去玩,或者劳逸结合偶尔刷刷公众号,所以今天就诈尸更新一篇干货,给大家解解闷~ ...
- 40张图全面解析TCP 三次握手和四次挥手
每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 哪种语言的开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. ...
- 跟着动画学习 TCP 三次握手和四次挥手
TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...
最新文章
- 综述:PyTorch显存机制分析
- 【转】Scrum角色及其职责介绍
- 优雅地记录Python程序日志2:模块组件化日志记录器
- 【回归预测】基于matlab哈里斯鹰算法优化混合核极限学习机KELM回归预测【含Matlab源码 1751期】
- jdk安装目录 usr java_Mac查看已安装的jdk版本和jdk安装目录
- 网络安全工程师必备浏览器插件
- 《计算智能导论》下载
- python读取手机通讯录_python爬取通讯录
- 图像处理:灰度变换与图像增强
- 大道至简(原标题:少是指数级的多)
- 年度回顾篇:2018年的亚马逊,众生虽苦,诸恶莫作
- dx12 龙书第十六章学习笔记 -- 实例化与视锥体剔除
- python:兔子繁殖问题
- CleanMyMac XMac苹果电脑专属系统优化工具
- 眼睛结构粗分离 - 巩膜 - 虹膜
- 《与君对酒》 徐正坤
- ubuntu安装opencv viz模块
- 关于elementui的table固定高度出现的表格高度有空缺
- 如何将.hwbk批量修改成.jpg 【实测成功】
- 历史上几次股市大崩盘
热门文章
- 查看python库的版本-python中查看第三方库的版本号
- python小项目实例流程-公司内项目对接钉钉审批流程(python)
- python安装路径怎么找-Python---查看安装路径
- html 移动设备不显示,IT兄弟连 HTML5教程 在移动设备上设置原始大小显示
- markdown引入代码_人人都会的Markdown
- sequelize的应用
- 操作符*或者-的重载
- 安装Docker:解决container-selinux = 2.9问题
- Hive 数仓中常见的日期转换操作
- 使用freemarker插入多行数据到word中