浅谈TCP协议(建立与断开连接)

TCP是面向连接的,可靠的进程到进程通信的协议。
TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存,用来临时存储数据。
TCP将若干个字节构成一个分组,成为报文段(segment)
TCP报文段封装在IP数据报中:

TCP报文段的首部格式如图:

首部长度为20--60字节,
源端口号:他是16位字段,为发送方进程对应的端口号。
目标端口号:他是16位字段,对应的是接收端的进程,接收端收到数据段后,根据这个端口号来确定把数据送给那个应用程序的进程。
序号:当TCP从进程接收数据字节时,就把他们存储在发送缓存中,并对每一个字节进行编号,编号的特点如下:
编号不一定从0开始,一般会产生一个随机数作为第一个字节的编号,成为初始序号(ISN)
TCP每个方向的编号都是互相独立的。
当字节都被编上号后,TCP就给每个报文段指派一个序号,序号就是该报文段中的第一个字节的编号
当数据到达目的后,接收端会按照这个序号吧把数据重新排列,保证数据的正确性
确认号:对发送端的确认信息,用它来告诉发送端这个序号之前的数据段都已经收到,如确认号是X,就是表示前X-1个数据段都已经收到
首部长度:用它可以确定首部数据结构的字节长度。一般情况下TCP的首部是20字节,但首部长度最大可以扩展为60字节
保留:这部分保留位供今后扩展功能使用,现在还没有使用到
控制位:这六位有很重要的作用,TCP的连接、传输和断开都受到这六个控制位的指挥。各位含义如下:
URG:紧急指针有效位
ACK:只有当ACK=1时,确认序列号字段才有效,当ACK=0时,确认号字段无效。
PSH:标志位为1时,要求接收方尽快将数据段送达应用层
RST:当RST值为1时,通知重新建立TCP连接
SYN:同步序号位,TCP需要建立连接时将这个值设为1
FIN:发送端完成发送任务位,当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1
窗口大小:说明本地可接收数据段的数目,这个值的大小是可变的,当网络通畅时将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP中的流量控制机制就是依靠变化窗口的大小实现的
校验和:用来做差错控制,与IP的校验和不同,TCP校验和的计算包括TCP首部、数据和其他填充字节,在发送TCP数据段时,由发送端计算校验和,当到达目的地时又进行了一次校验和计算,若这两次的校验和一致,则说明数据基本是正确的,否则将认为该数据已被破坏,接收端将丢弃该数据
紧急指针:和URG配合使用,当URG=1时有效
选项:在TCP首部可以有多达40字节的可选信息
TCP连接:
TCP是面向连接的协议,它在源点和终点之间建立一条虚连接。TCP报文段封装成IP数据报后,每一个IP数据报可以走不同的路径到达终点,因此收到的IP数据报可能不按顺序到达,甚至可能丢失或损坏。如果一个报文段没有按顺序到达,那么TCP保留它,然后等待它之前的报文段到达;如果一个报文段丢失或损坏,那么TCP就要重传。总之,TCP保证报文段是有序的。
在数据通信之前,发送端与接收端要先建立连接;等待数据发送结束后,双方再断开连接。TCP连接的每一方都是由一个IP地址和一个端口号组成的。
TCP建立连接的过程称之为三次握手:
三次握手可以理解为两个人在打电话
A:你好,我是A,能听见说话么
B:听到了,我是B,你能听见我说话吗
A:可以的
第一次握手:客户端使用一个随机的端口号向服务器端的80/443端口发送建立连接的请求,此过程的典型标志就是TCP的SYN控制位为1,其他五个控制位全为0。

第二次握手:实际上是分两部分来完成的。当服务端接受到了客户端的请求,向客户端回复一个确认消息,此过程的典型标志就是TCP的ACK控制位为1,其他五个控制位全为0,而且确认序列号是客户端的初始序列号+1。
服务端也向客户端发送建立连接的请求,此过程的典型标志和第一次握手一样。
为了提高效率,一般将这两部分合并在一个数据包里实现。

第三次握手:客户端收到了服务端的回复(包含请求和确认),也要向服务端回复一个确认信息,此过程的典型标志就是TCP的ACK控制位为1,其他五个控制位全为0,而且确认序列号是服务端的初始序列号+1。

上图中Seq表示请求序列号,ACK表示确认序列号,SYN和ACK为控制位,可以看出SYN位只有在请求建立连接时才被设置为1。

TCP使用面向连接的通信方式,它提高了数据传输的可靠性,使发送端和接收端在数据正式传输之前就有了交互,为数据正式传输打下了可靠的基础。

TCP断开连接:

参加交换数据的双方中的任何一方(客户端或服务端)都可以关闭连接。TCP断开连接分四步,也称为四次握手,具体过程如下:

服务器向客户端发送FIN和ACK位置1的TCP报文段。
客户端向服务器返回ACK位置1的TCP报文段(此时已经单向断开了连接)。

客户端向服务端发送FIN和ACK位置1的TCP报文段。
服务端向客户端返回ACK位置1的TCP报文段。
在TCP断开连接的过程中,有一个半关闭的概念,TCP的一方(通常是客户端)可以终止发送数据,但仍然可以接受数据,称为半关闭。主要是用在客户端不需要发送数据了,会发送一个FIN报文段,半关闭这个连接,服务器发送ACK报文段接受半关闭,服务端会继续传输数据,而客户端只发送ACK确认,不再发送任何数据。当服务端把所有的数据发送完毕时,就发送FIN报文段,客户端再发送ACK报文段,这样就断开了TCP连接。

为什么TCP协议终止连接要四次?

1、当客户端确认发送完数据且知道服务端已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给服务端。

2、服务端收到客户端发送的FIN,表示收到了,就会发送ACK回复。

3、但这时服务端可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到服务端数据发送完了,才会发送FIN给客户端。

4、客户端收到服务端发来的FIN,知道服务端的数据也发送完了,回复ACK, 客户端等待2MSL以后,没有收到B传来的任何消息,知道服务端已经收到自己的ACK了,客户端就关闭连接,服务端也关闭连接了。

原文地址:https://blog.51cto.com/14227204/2391334

时间: 2024-10-06 10:36:15

浅谈TCP协议(建立与断开连接)的相关文章

浅谈 TCP 三次握手

三次握手(three times handshake:three-way handshake)所谓的"三次握手"即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送.接收完毕后何时撤消联系,并建立虚连接. 在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认: 第二次握手:服务器

【转】 浅谈Radius协议

浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下,从RADIUS协议谈谈对身份认证的认识,也总结一下自己. 一.RADIUS协议原理 RADIUS(Remote Authentication Dial In User Service) 用户远程拨入认证服务,它主要针对的远程登录类型有:SLIP.PPP.telnet和rlogin等.RADIUS协议

Linux网络编程——浅谈 TCP 三次握手和四次挥手

一.tcp协议格式 二.三次握手 在 TCP/IP 协议中.TCP 协议提供可靠的连接服务,採用三次握手建立一个连接. 第一次握手:建立连接时,client发送 syn 包(tcp协议中syn位置1.序号为J)到server,并进入 SYN_SEND 状态.等待server确认: 第二次握手:server收到 syn 包,必须确认客户的 SYN,同一时候自己也发送一个 SYN 包,即 SYN+ACK包(tcp协议中syn位置1,ack位置1.序号K,确定序号为J+1),此时server进入 SY

TCP四次挥手断开连接详解

TCP四次挥手. 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状态.A的应用程序先向TCP发出连接释放报文段,主动关闭TCP连接.A把连接释放报文段的首部FIN置为1,序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1.这时A进入FIN-WAIT-1状态,等待B的确认. B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1.然后B就进入CLOSE-WAIT状态.TCP

浅谈TCP/IP协议

一.简介 TCP/IP协议是供已连接因特网的计算机进行通信的通信协议.TCP/IP协议,并不是指单TCP.IP协议两个.而是一个协议栈.包含了诸如:TCP.IP.UDP.ICMP.RIP.TELNETFTP.SMTP.ARP.TFTP等许多协议. 二.参考模型 TCP/IP参考模型 应用层 传输层 网络层 链路层 三.工作机制 TCP/IP 意味着 TCP 和 IP 在一起协同工作. TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信. IP 负责计算机之间的通信. TCP 负责将数据分

TCP协议建立连接与释放连接

TCP建立连接三次握手 1. 客户端发出段1,SYN位表连接请求.序号是1000,这个序号在络通讯中作临时的地 址,每发个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺 序,也可以发现丢包的情况,另外,规定SYN位和FIN位也要占个序号,这次虽然没发数 据,但是由于发了SYN位,因此下次再发送应该序号1001. mss表最段尺,如果 个段太,封装成帧后超过了链路层的最帧长度,就必须在IP 层分,为了避免这种情 况,客户端声明的最段尺,建议服务器端发来的段不要超过这个长度.

浅谈TCP IP协议栈(四)IP协议解析

通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输中的数据报)的发送和接收,而整个协议栈内的协议,也是可以分为之前介绍过的链路层->网络层->传输层->应用层,在这每一层中都有很多不同的协议,但是最常用的协议,每一层就是一到两种,所以想学协议,先从每一层最常见,最常用的开始学起: 链路层--以太网.VLAN 网络层--IP协议 传输层--T

浅谈Http协议与TCP/IP协议

由于最近找工作需要准备这两个协议方面的问题,所以对这两个传输协议来总结一下自己的看.网上各路大神对这两个传输协议已经分析的非常透彻了,在下才疏学浅,仅说一下自己的想法,以供参考,同时也是对自己的一个经验总结. 1.http协议,即超文本传输协议,英文名叫做Hypertext Transfer Protocol,是一种浏览器和服务器之间沟通的一种规范,使用在应用层,用于解决如果包装数据,是一种应用层协议.是基于TCP/IP协议之上的,具体可参考OSI七层协议,这里不再赘述. Http的请求方式包括

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust