TCP(Transmission Control Protocol)是一种面向连接的传输层协议,它提供了可靠的、有序的、字节流传输的机制。以下是TCP协议的特点:
-
面向连接:TCP使用三次握手的方式建立连接,确保通信的可靠性。
-
可靠性:TCP协议使用确认机制和流量控制来保证数据的完整性和可靠性,确保数据的准确传输。
-
有序性:TCP保证数据的有序传输,通过序号和确认机制来实现数据的有序性。
-
高效性:TCP使用了滑动窗口的机制,使得数据传输更加高效。
#协议层与设备
应用层——计算机
传输层——计算机、防火墙
网络层——路由器
数据链路层——交换机
物理层——网卡网线
问:一次TCP可以发送多少HTTP请求
现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?
一个 TCP 连接可以对应几个 HTTP 请求?
一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?
为什么有的时候刷新页面不需要重新建立 SSL 连接?
浏览器对同一 Host 建立 TCP 连接到数量有没有限制?
https://baijiahao.baidu.com/s?id=1761049607379705379&wfr=spider&for=pc
问:linux的TCP连接数量最大不能超过65535个吗
linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?
https://www.cnblogs.com/lidabo/p/15618724.html
https://www.jianshu.com/p/03d221f18a84
首先,问题中描述的65535个连接指的是客户端连接数的限制。
在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少呢?
如何标识一个TCP连接
在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{localip, localport,remoteip,remoteport}。
client最大tcp连接数
client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,一个client最大tcp连接数为65535,这些连接可以连到不同的serverip。
server最大tcp连接数
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remoteip(也就是clientip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
实际的tcp连接数
上面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。
所以,对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万,甚至上百万是没问题的。
《计算机网络基础》
第五章 数据传输控制协议
5.1 传输控制协议TCP概述
5.1.1 TCP的特点
TCP是面向连接的传输层协议,在无连接、不可靠的IP网络服务基础之上提供可靠交付的服务。TCP提供全双工通信。
面向字节流
面向字节流的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来数据看成仅仅是一连串无结构的字节流。
TCP面向流的概念
TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
注意
TCP连接是一条虚连接,而不是一条真正的物理连接。
TCP对应用进程一次把多长的报文发送到TCP的缓存中是不关心的。
TCP根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用进程给出的)。
TCP把过长的数据库划分短一些再传送。也可等待积累足够多的字节后再构成报文段发送出去。
5.1.2 TCP的连接
TCP把连接作为最基本的抽象。每一条TCP连接有两个端点。
TCP连接的端点叫做套接字Socket或插口。
TCP连接::={socket1, socket2}={(IP1:port1),({IP2:port2})}
注:TCP连接的端点不是主机也不是主机的IP地址,不是应用进程,也不是传输层的协议端口。
端口号拼接到(contatenated with)IP地址即构成了套接字。每一条TCP连接唯一地被通信两端地两个端点(即两个套接字)所确定。
5.2 TCP的报文段的首部格式*
一个TCP报文段分为首部和数据两部分,而TCP全部功能都体现它首部中各字段的作用。
TCP报文首部的前20各字节是固定的,后面有4n字节是根据需要而增加的选项。TCP首部的最小长度是20字节。
源端口和目的端口——各占2字节。
序号SEQ(sequence)——字段占4字节。
确认号(ack)小写——与大写的区别是?
数据偏移(即首部长度)——占4位,它报出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位字。
保留字段——占6位。
紧急URG,URG=1表明紧急指针字段有效,它告诉系统此报文中有紧急数据,应尽快传送(相当于高优先级的数据)。
确认ACK,当ACK=1时确认号字段才有效,当ACK=0确认号无效。
推送PSH,接收TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满之后再向上交付。
复位RST(ReSeT),当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输连接。
同步SYN,SYN=1表示这是一个连接请求或连接接受报文。
终止FIN(FINish),释放一个连接,FIN=1表明此报文段地发送段的数据已发送完毕,并要求释放传输连接。
窗口字段——占2字节,窗口字段用来控制对方发送的数据量,单位为字节,TCP连接的一端根据设置缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
检验和——占2字节,检验首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部(临时把12字节的“伪首部”和TCP报文段连接在一起),仅仅是为了计算检验和。
紧急指针字段——占16位,指出在本报文段中紧急数据共有多少各字节。指出在本报文段中的紧急数据的最后一个字节的序号。
选项字段——MSS(Maximum Segment Size)长度可变,是TCP报文段中的数据字段的最大长度。
为什么要规定MSS?
MSS与接收窗口值没有关系。
若选择较小的MSS长度,网络的利用率就降低。最佳的MSS是很难确定的。
若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传。这些也都会使开销增大。因此MSS应尽可能大些,只要在IP层传输时不需要再分片就行。
其他选项
窗口扩大选项——占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。
时间戳选项——占10字节,其中最主要的字段时间戳字段(4字节)和时间戳回送回答字段(4字节)。
5.3 可靠传输的工作原理
理想传输条件有两个特点:
1传输信道不产生差错。2不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。2在这样理想传输条件下,不需要采取任何措施就能够实现可靠传输。
实际网络都不具备理想条件。必须使用可靠传输协议,在不可靠的传输信道实现可靠传输。
5.3.1 停止等待协议
利用反馈重发机制实现可靠传输
- 利用TCP可靠传输协议——
反馈重发机制
实现可靠传输。又叫自动请求重传ARQ
(Automatic Repeat Request),是指当接收方发现错误时,要给发送方反馈要求重发,重传的请求是自动进行的。包括:重传出错数据;匹配收发双方的速率。
使用确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。
常见的实现方法:1.停止等待协议;2.连续ARQ协议。
5.3.1 停止等待协议
发送端在发出一分组后必须停下来等待接收端对所发送的分组进行确认,若确认收到则发送方继续发送下一分组。全双工通信的双方既是发送方也是接收方。
问题:A如何知道B是否正确收到了包M1呢?
解决方法:超时重传
1.发送方A为每一个已发送的分组都设置了一个超时计时器(timeout timer)。A只要在超时计时到期之前收到了相应的确认,就撤销该超时计时器。一般可将重传时间选为略大于“从发完数据分组到收到确认分组所需的平均时间”。
问题:若数据包分组正确到达B,但B回送确认丢失或延迟了,A未收到B的确认,会超时重发。B如何知道收到了A重复的数据包,需要丢弃呢?
解决方法:编号,A为每一个发送的分组都进行编号,若接收方B收到编号相同的分组,则认为收到了重复分组,丢弃重复的分组,并回送确认。
确认分组的编号问题
确认分组ACK——正确接收的分组被称为确认分组。将确认序号n表示为ACKn,ACK1表示0号分组已收到,现在期望接收的下一个数据是1号分组。
3.确认丢失和确认迟到
4.信道利用率
当往返时间RTT远大于分组发送时间TD时,信道的利用率就会非常低。若出现重传,信道的利用率就还要降低。
解决思路:采用流水线传输,发送方可以连续发送多个分组,提高信道利用率。
5.3.2 连续ARQ协议
类型:拉回方式(back to n);选择性重传方式(selective repeat)
5.4 TCP的流量控制
流量控制的作用是为了平衡双方的数据吞吐量,使发送方所发出的数据流量,使其发送速率不要超过接收方所能接收的速率。流量控制的关键是信息反馈机制,使发送方能了解接收方是否具备足够的接收处理能力。
5.4.1 滑动窗口协议
存在各种不同的流量控制机制,如简单的停止等待协议。
滑动窗口协议(slide window)是一种流量控制技术,该技术不仅存在于数据链路层(帧),也存在于传输层(字节数据)。滑动窗口协议将确认于流量控制巧妙地结合在一起。
窗口,对应的是一段可以被发送者发送的字节序列,其连续的范围称为窗口。
滑动,是指这段允许发送的范围是可以随着发送的过程而变化的。
滑动窗口的大小意味着接收方还有多大的缓冲区可用于接收数据,发送方可通过滑动窗口大小来确定应发送多少字节的数据。
(a)发送端设置发送窗口
1发送窗口用来对发送端进行流量控制,在发送窗口内保持的一组序列号对应于允许发送的分组。
2发送窗口的大小Ws代表还未收到对方确认信息的情况下发送端最多可以发送多少各数据。
(b)接收端设置接收窗口(略)
滑动窗口协议的重要特性
在TCP协议中,窗口大小在传输过程中还可以动态调整。
只有在接收窗口向前滑动时(同时发送了确认),发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。
当发送窗口和接收窗口的大小都等于1时,就是停止等待协议。
TCP连接的每一端都必须设有两个窗口,一个发送窗口和一个接收窗口。TCP两端的四个窗口经常处于动态变化之中。
5.4.2 利用滑动窗口实现流量控制
一般来说我们总是希望数据传输得更快一些。但如果发送方把数据发送过快,接收方就可能来不及接收,这就会造成数据的丢失。
**流量控制(flow control)**就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在TCP连接上实现流量控制。
可能发生死锁(持续计时器)
B向A发送了零窗口地报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwnd=400的报文段。但这个报文段在传送过程丢失了,A一直等待接收到B发送的非零窗口的通知,而B也一直等待A发送的数据。这种互相等待的死锁局面将一直延续下去。为了解决这个问题,TCP为每一个连接设有一个持续计时器(persistence timer)。
只要一方收到对方的零窗口通知就启动该持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。若窗口值仍为零,则收到这个报文段的一方就重新设置持续计时器。若窗口不是零,则死锁的僵局就可以打破了。
5.5 TCP连接管理
5.5.1 TCP的连接建立
5.5.2 TCP的连接释放
参考地址
OSI七层模型
https://blog.youkuaiyun.com/yj11290301/article/details/128734183
图解 TCP 滑动窗口工作原理
https://zhuanlan.zhihu.com/p/650019037
其他
函数
要完成一个完整的 TCP/IP 网络通信过程,需要使用一系列函数来实现。这些函数包括 bind、listen、accept 和 recv/send 等。下面是它们的配合流程:
1.创建套接字(socket):使用 socket 函数创建一个套接字,指定协议族和套接字类型。
2.绑定地址(bind):将本地地址绑定到套接字上,使得客户端可以通过该地址访问服务器。
3.监听连接请求(listen):将套接字设置为监听状态,并指定最大等待连接数(backlog)。
4.接受连接请求(accept):当有客户端发起连接请求时,使用 accept 函数创建新的套接字用于与客户端进行通信。
5.读写数据(recv/send):使用新创建的套接字进行数据传输,包括从客户端读取数据和向客户端发送数据。
6.关闭连接(close):在通信结束后,需要使用 close 函数关闭套接字以释放资源。
对于第4步的请求,如果向下面方式处理,则只能接受一个客户端的请求。注意,如果把accept放在while循环里,也不能解决多客户端请求,反而会发生阻塞。
UDP
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1] 是UDP的正式规范。UDP在IP报文的协议号是17
ARP 地址解析协议(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。