首页 > 其他分享 >TCP基础知识

TCP基础知识

时间:2023-07-26 22:32:18浏览次数:35  
标签:接收端 TCP 基础知识 发送 序号 数据 连接

TCP详解

TCP和UDP

TCP和UDP都是传输层的协议。

UDP:用户数据报协议,面向无连接,可以单播、多播、广播,面向数据报,不可靠交付

TCP:传输控制协议,面向连接的,可靠的,基于字节流,仅支持单播传输

TCP基础知识_TCP


TCP三次握手

TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓“连接”,其实是客户端和服务器端内存里保持的一份关于对方的信息(IP地址、端口号)

TCP可以看作是一种字节流,他会处理IP层或以下的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放到TCP头部

TCP提供一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接、四次挥手来关闭一个连接。

TCP基础知识_TCP_02

第一次握手: 1.客户端将SYN标志位置为1 2.生成一个随机的32位的序号seq=J ,这个序号后边是可以携带数据(数据的大小) 第二次握手: 1.服务器端接收客户端的连接:ACK=1 2.服务器会回发一个确认序号: ack=客户端的序号+数据长度(上图中假设传输数据为0,仅SYN占据了一个字节)+SYN/FIN(按一个字节算) 3.服务器端会向客户端发起连接请求: SYN=1。4.服务器会生成一个随机序号:seq =K 第三次握手:1.客户单应答服务器的连接请求:ACK=1。2.客户端回复收到了服务器端的数据:ack=服务端的序号+数据长度+SYN/FIN(按一个字节算)

seq为序号,ack为确认序号。仅当SYN=1的时候,序号seq才有用。同理,仅当ACK=1的时候,确认序号ack才有用。

为什么是3次握手呢?

通过3次握手才能够确定客户端的发送数据、数据数据的功能正常。服务器端的接收数据和发送数据正常。2次握手显然无法证明,比如客户端端发送SYN连接请求,服务器端回应ACK报文并发送,那么只能证明客户端发送数据正常,接收数据的能力不能确定。4次握手也可以达到,但是3次就能搞定,多花费一次没有必要。并且在三次握手的过程中,双方协商了一些信息,例如双方发送序号的初始值、最大段尺寸。

TCP滑动窗口

滑动窗口是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络拥挤情况直接发送数据。由于大家不知道网络拥挤状况,同时发送数据,导致中间节点阻塞丢包,谁也发送不了数据,所以就有了滑动窗口机制来解决此问题。滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包(窗口尺寸)。

还有一种情况,当发送端发送的速度较快,接收端收到数据后处理速度较慢,而接收缓冲区的大小是固定的(一般采用循环队列),就会丢失数据。TCP协议通过“滑动窗口”机制解决着一问题。

TCP基础知识_数据_03

看上面的通讯过程:

  1. 发送端(客户端)发起连接,声明最大尺寸是1460。初始序号是0,窗口大小4K,表示“我的接收缓冲区还有4K字节空闲区,你发送的数据不要超过4K”。接受端应答连接请求,声明最大段尺寸是1024,初始序号是8000,窗口大小是6K。发送端应答,三次握手结束。
  2. 发送端发出段4-9,每一个段带1K的数据,发送端根据窗口大小知道接受端的缓冲区满了,因此停止发送数据。(6*1024=6K)
  3. 接收端的应用程序处理了2K数据,接受缓冲区有2K空闲,接收发出段10,再应答已收到6K数据同时声明窗口大小为2K,并且包含了下一次发送的序号
  4. 接收端的应用程序处理了2K数据,接收缓冲区有4K空闲,接收发出段11。重新声明窗口大小为4K.
  5. 发送端发出段12-13,每一个段带1K数据,段13同时包含FIN位(FIN表示断开连接)
  6. 接收端应答接收到2K数据(6145-8192),再加上FIN位占用一个序号8193,因此告知发送端下次发送从序号8194开始,连接处于半关闭状态,接收段同时声明窗口大小为2K
  7. 接收端的应用程序处理了2K数据,接收端重新声明窗口大小为4K
  8. 接收端的应用程序处理了2K数据,接收端重新声明窗口大小为6K
  9. 接收端的应用程序处理全部数据后,决定关闭连接,发出段17,包含FIN位,发送端应答,连接完全关闭随着应用程序提走数据,虚线框不断向右滑动,因此称为滑动窗口

我们还可以分析出一个现象:应用程序所看到的数据是一个整体或者说是一个流,在底层通讯中这些数据可能被拆成数据包来发送,但是一个数据包有多少字节对应用程序是不可见的,因此TCP协议是面向字节流的协议,而UDP是面向消息的协议,每一个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的

标签:接收端,TCP,基础知识,发送,序号,数据,连接
From: https://blog.51cto.com/u_16188116/6861720

相关文章

  • TCP和UDP的区别以及各自的应用场景
    TCP和UDP区别:1.连接TCP是面向连接的传输层协议,传输数据前先要建立连接。UDP是不需要连接的,即刻就可以传输数据。2.服务对象TCP是一对一的两点服务,也就是说一条连接只有两个端点。UDP支持一对一,一对多,多对多的交互通信。3.可靠性TCP是要保证可靠交付数据的,数据无差错,不丢失......
  • TCP | UDP
    TCP三次握手第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(SynchronizeSequenceNumbers)。第二次握手:服务器收到syn包并确认客户的SYN(ack=j+1),同时也发送一个自己的SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三......
  • AI训练营—Python的一些基础知识
    目录列表字典复制对象列表切片:左开右闭倒取值字典集合:无序的,元素是唯一的dk_set=set()#也可以是dk_set={},创建一个空的集合#集合的并union(),交intersection(),差difference()#集合不会出现重复元素foriin"Dkfor3,Dkfor3":dk_set.add(i)#添加元素i的值进集合......
  • PROFINET转TCP/IP网关profinet电缆
    大家好,今天要和大家分享一款自主研发的通讯网关,捷米JM-PN-TCPIP。这款网关可是集多种功能于一身,PROFINET从站功能,让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗?一起来看看吧!首先,这款网关可以连接到PROFINET总线中作为从站使用,同时还能连接到TCP/I......
  • LR调色基础知识
    曝光度和对比度:提高亮度。轻微减少对比度。(曝光调整的是整个画面的亮度)高光和白色色阶:减少高光和白色色阶以增加亮部的细节。阴影和黑色色阶:增加阴影和黑色色阶以提高暗部的细节。清晰度和去朦胧:轻微的提高数值以提高画面的通透感。鲜艳度和饱和度:轻微的提高数值以提高画面......
  • 协议 tcp rpc http websocket
    传输层:tcp,udp应用层:http,grpc,websocket浏览器服务器太多了,互相沟通需要统一的协议,http主要用于B/S如果是公司内部,轻量小巧定制化,用rpchttp是半双工,同一时间,只能一方发送消息,客户发送请求,建立http连接后,通过header可以申请升级到websocket协议 待补充wireshark的抓包分析:......
  • 【网络编程】基础知识(Web Server和HTTP协议)
    WebServer一个WebServer就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个Error......
  • redis基础知识
    Redis是什么?Redis(RemoteDictionaryServer)远程字典服务,是一个开源的使用ANSIC语言编写、支持网路、可基于内存也可持久化的日志型,key-value(NoSql---->non-relational)数据库Redis的特点?性能极高,基于内存,读的速度是11万次/s,写的速度是81千次/s丰富的数据类型,支持string、has......
  • 详解TCP网络协议栈的工作原理
    本文分享自华为云社区《网络通信的神奇之旅:解密LinuxTCP网络协议栈的工作原理》,作者:LionLong。一、TCP网络开发APITCP,全称传输控制协议(TransmissionControlProtocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。1.1、TCP服务器调用的API#include<sys/types......
  • 随笔02---JavaSE基础知识
    (1)基本数据类型:八大基本数据类型:1、整数类型:byte占1字节short占2字节int占4字节long占8字节(定义时后面加L)2、浮点数类型:float占4字节(后加F)double占8字节3、字符类型:char占2字节4、布尔类型:boolean占1个比特位(1bit)(2)引用数据类型:类、接口、数组-------------......