计算机基础——TCP基础知识
一、TCP报文首部的字段及作用
16位源端口号 | 16位目的端口号 | |||||||
32位序号 | ||||||||
32位确认号 | ||||||||
4位头部长度 | 6位保留 | URG | ACK | PSH | RST | SYN | FIN | 16位窗口大小 |
16位校验和 | 16位紧急指针 | |||||||
选项(长度可变) | ||||||||
填充 |
- 16位端口号:源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序
- 32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。
- 32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。
- 4位头部长度:表示tcp头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。
- 6位标志位:URG(紧急指针是否有效),ACk(表示确认号是否有效),PSH(缓冲区尚未填满),RST(表示要求对方重新建立连接),SYN(建立连接消息标志接),FIN(表示告知对方本端要关闭连接了)
- 16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
- 16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
- 16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
二、TCP的特点
-
TCP是
面向连接
的运输层协议 -
点对点
,每一条TCP连接只能有两个端点 -
TCP提供
可靠交付
的服务 -
TCP提供
全双工通信
-
面向字节流
基于连接,可靠的,有序的,双向的一种字节流传输方式,TCP要发送的数据先放入缓冲区内,在通信的时候TCP会从缓冲区内取出对应的数据,在进行头部的封装进行发送
好处:传输比较灵活
坏处:
- 会产生粘包问题——将多条数据当做一条进行处理,无法分辨数据边界
- 本质原因:TCP并不维护数据边界
- 解决方案:需要程序员在应用层进行数据边界管理,区分数据边界
- 具体技术:特殊字符,数据定长,应用层头部加上数据长度字段
- 会产生粘包问题——将多条数据当做一条进行处理,无法分辨数据边界
三、TCP和UDP的区别
-
TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
-
TCP提供可靠的服务;UDP不保证可靠交付。
- TCP的连接是基于
三次握手
,断开是基于四次挥手
。确保连接和断开的可靠性 -
TCP有状态
;记录哪些数据发送了,哪些数据被接收了,哪些没有被接收,并且保证数据包按序到达,保证数据传输不会出差错 -
可控制
:有数据包校验、ACK应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制
- TCP的连接是基于
-
TCP面向字节流,把数据看成一连串无结构的字节流;UDP是面向报文的。
-
TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
-
每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的通信方式。
-
TCP首部开销20字节;UDP的首部开销小,只有8个字节。
四、TCP和UDP分别对应的常见应用层协议
1.基于TCP的应用层协议
- HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80
- FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)
- SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25
- TELNET: Teletype over the Network (网络电传), 默认端口23
- SSH:Secure Shell(安全外壳协议),默认端口 22
2.基于UDP的应用层协议
- DNS : Domain Name Service (域名服务),默认端口 53
- TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69
- SNMP:Simple Network Management Protocol(简单网络管理协议),通过UDP端口161接收,只有Trap信息采用UDP端口162。
五、TCP的粘包和拆包
TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
为什么会产生粘包和拆包?
- 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
- 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
- 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
- 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。
解决方案
- 发送端将每个数据包封装为固定长度
- 在数据尾部增加特殊字符进行分割
- 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。
六、TCP的滑动窗口机制
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 TCP会话的双方都各自维护一个发送窗口和一个接收窗口。接收窗口大小取决于应用、系统、硬件的限制。发送窗口则取决于对端通告的接收窗口。接收方发送的确认报文中的window字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文window字段设置为 0,则发送方不能发送数据。
于对端通告的接收窗口。接收方发送的确认报文中的window字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文window字段设置为 0,则发送方不能发送数据。
[外链图片转存中…(img-K6LdSSp7-1705311813516)]文章来源:https://www.toymoban.com/news/detail-809623.html
TCP头包含window字段,16bit位,它代表的是窗口的字节容量,最大为65535。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。接收窗口的大小是约等于发送窗口的大小。文章来源地址https://www.toymoban.com/news/detail-809623.html
到了这里,关于计算机基础——TCP基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!