TCP(控制传输协议)详解
1、传输层概述
- 在OSI参考模型中,网络层是面向通信的最高层但同时也是面向用户程序的最底层。
- 传输层的主要作用:
- 复用:在发送端,多个应用程序公用一个传输层;
- 分用:在接收端,传输层把从网络层接收到的数据报拆掉IP报头之后依据端口号分派给不同的应用程序
- 传输层和网络层的主要区别:
- 网络层为不同主机提供通信服务,而传输层为不同主机的不同应用程序提供通信服务;
- 网络层指对报文头部进行差错检验,而传输层会对整个报文进行差错检验
2、TCP协议的特点
- 面向连接的:双方通信之前需要建立连接,通信完成之后还要释放连接
- 提供可靠的数据交付服务:TCP协议提交的数据保证和发送方发送的数据是完全一致的
- 提供点到点的通信服务
- TCP传输是面向字节流的,传输过程中数据被划分成一个个的数据报,但这只是为了传输方便
- TCP是全双工通信,通信双方都能作为发送端发送数据,也能作为接收端接收数据
3、三次握手:当TCP协议中通信双方建立连接的过程称之为三次握手

备注:在TCP协议中,主动发起请求的一方成为客户端,被动接收请求的一方为服务端,但不管是客户端还是服务端,TCP连接建立完成之后都能发送和接收数据。起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。
第一次握手:客户端向服务端发送一个建立连接的请求报文,此时的报文头部信息中SYN=1,ACK=0,seq=x,请求报文发送之后客户端便进入了SYN-SENT状态。
- SYN=1,ACK=0表示该报文段为连接请求报文。
- x为本次TCP通信的字节流的初始序号。
第二次握手:服务端收到客户端的连接请求的报文后,如果同意连接,则会向客户端发送一个应答报文:SYN=1,ACK=1,seq=y,ack=x+1
服务端在发送完这个报文之后就进入了SYN-RCVD状态。
- SYN=1,ACK=1表示该报文段为连接同意的应答报文
- seq=y表示服务端作为发送者时,发送字节流的初始序号。
- ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。
第三次握手:当客户端收到服务端的连接同意的应答报文后,还要向服务端发送一个确认报文段,表示:服务端发送的连接请求的应答报文已经成功收到。
4、四次挥手:当TCP协议中通信双方释放连接的过程称之为四次挥手

备注:TCP连接是双向的,所以前两次挥手用于断开一个方向的连接,后两次回收用于断开一个方向的连接。
第一次挥手:
当A认为发送给B的数据已经全部发送完毕,则A主动向B发送释放连接的请求报文,此时,A将进入FIN-WAIT-1状态。
第二次挥手:
当B接收到A发送的请求断开连接的报文之后,会通知相应的程序从A发送到B的数据已经全部完成,并且从A到B的连接将会断开。此时的B将进入 CLOSE-WAIT状态,并且会向A发送同意断开连接的应答报文。
A收到该应答之后,进入FIN-WAIT-2状态,等待B发送连接释放请求。
第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
第三次挥手:
当B向A发送完所有的数据之后,B会向A发送连接释放的请求。此时的B便进入LAST-ACK状态。
第四次挥手:
A收到释放请求后,向B发送确认断开连接的应答报文,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
5、为什么连接建立需要三次握手,而不是两次握手?
防止失效的连接请求报文段被服务端接收,从而产生错误。
若建立连接只需两次握手,客户端其实并没有太大的变化,仍然需要在获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。如果在客户端发送连接请求的时候网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便会超时重发请求,此时如果服务端正确接收连接请求并确认应答,双方便开始通信,通信结束后释放连接。
此时如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待接收数据或主动发送数据,但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
6、为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?
为了保证第四次挥手之后B能够接收到A的确认应答的报文。 因为A发完确认应答报文后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
TCP(控制传输协议)详解的更多相关文章
- netty系列之:kequeue传输协议详解
目录 简介 KQueueEventLoopGroup KQueueEventLoop KQueueServerSocketChannel和KQueueSocketChannel 总结 简介 在前面的章 ...
- TCP之四:TCP 滑动窗口协议 详解
滑动窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口:同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口.发送窗口和接收窗口的序号的 ...
- 计算机网络——TCP与UDP协议详解
根据应用程序的不同需求,运输层需要两种不同的运输协议,即面向连接的TCP和无连接的UDP. TCP:传输控制协议 TCP特点: 1)TCP是面向连接的运输层协议.所以,应用程序在使用TCP协议之前,必 ...
- 快来体验快速通道,netty中epoll传输协议详解
目录 简介 epoll的详细使用 EpollEventLoopGroup EpollEventLoop EpollServerSocketChannel EpollSocketChannel 总结 简 ...
- 流媒体传输协议详解之---RTSP认证
from:http://blog.csdn.net/machh/article/details/52121648 Rtsp认证主要分为两种: 基本认证(basic authentication)和 ...
- TCP协议详解
TCP协议详解 一.TCP协议 1.TCP 通过以下方式提供可靠性: · ◆ 应用程序分割为TCP认为最合适发送的数据块.由TCP传递给IP的信息单位叫做报文段. · ◆ 当TCP发出一个报文段后 ...
- 【转载】TCP /IP协议详解
首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...
- 第3章 TCP协议详解
第3章 TCP协议详解 3.1 TCP服务的特点 传输协议主要有两个:TCP协议和UDP协议,TCP协议相对于UDP协议的特点是 面向连接使用TCP协议通信的双方必须先建立连接,完成数据交换后,通信双 ...
- TCP协议详解7层和4层解析(美团,阿里) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌握
如果想了解HTTP的协议结构,原理,post,get的区别(阿里面试题目),请参考:HTTP协议 结构,get post 区别(阿里面试) 这里有个大白话的解说,可以参考:TCP/IP协议三次握手和四 ...
- TCP协议详解(理论篇)
TCP协议详解(理论篇) 2012-08-20 0个评论 作者:陈立龙 收藏 我要投稿 TCP协议详解(理论篇) 1. 与UDP不同的是,TCP提供了一种面向连接 ...
随机推荐
- 记一次解决netty半包问题的经历
最近学习了netty,想写一个简单的rpc,结果发现发送消息时遇到难题了,网上搜了一下,这种情况是半包问题和粘包问题,主要是出现在并发高一些的时候. talk is cheap 客户端编码: prot ...
- 提高MYSQL大数据量查询的速度
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- oracle 表所占空间统计
1.通过查询dba_segments Select owner,segment_name,sum(bytes)/1024/1024 as MB from dba_segments group by o ...
- python多任务抓取图片
import re import urllib.request import gevent def download(image_download, images_path,i): headers = ...
- 20175214 《Java程序设计》第8周学习总结
20175214 <Java程序设计>第4周学习总结 前言:由于个人原因回家了两周,java学习进程落下了两周,且目前需交的实验报告较多,暂时无法补上前两次的博客,在将来会陆续补上,这次直 ...
- hammer.js初探
hammer.js官方文档 hammerjs是什么 hammerjs是一个短小精悍的库,他可以让我们轻松的实现移动端上的手势. hammerjs的两大优势如下: 为移动端网页添加相关手势. 去除移动端 ...
- Beta答辩总结
组员名单 短学号 姓名 备注 409 后敬甲 组长 301 蔡文斌 315 黄靖茹 423 刘浩 317 黄泽 328 卢泽明 617 葛亮 344 张杰 348 朱跃安 链接汇总 组长博客:后敬甲 ...
- 关于/tmp/ 目录自动清理文件
问题:今天开发人员给我说了一个错误:The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/loca ...
- proxy ubunta
/etc/environment : Is the correct place to specify system-wide environment variables that should be ...
- 源码解析Django CBV的本质
Django CBV模式的源码解析 通常来说,http请求的本质就是基于Socket Django的视图函数,可以基于FBV模式,也可以基于CBV模式. 基于FBV的模式就是在Django的路由映射表 ...