目录
TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP是互联网中使用最广泛的协议之一,与IP协议一起构成TCP/IP协议族的基础。
源端口(Source Port) | 16 | 发送方使用的端口号,标识发送数据的应用程序。 |
目的端口(Destination Port) | 16 | 接收方使用的端口号,标识接收数据的应用程序。 |
序号(Sequence Number) | 32 | 数据流中的第一个字节的编号,用于确保数据按序到达。 |
确认号(Acknowledgment Number) | 32 | 对方需要确认的最后一个已接收字节的编号+1。 |
首部长度(Heade Length) | 4 | 表示TCP头部长度,以32位字(4字节)为单位。 |
保留(Reserved) | 6 | 必须为0,通常用于将来扩展。 |
控制位(Control Bit) | 8 | 包含多个控制位,如URG(紧急)、ACK(确认)、PSH(急切)、RST(重置)、SYN(同步)、FIN(断开)。 |
窗口大小(Window Size) | 16 | 接收方期望的下一报文段的最大长度。 |
校验和(Checksum) | 16 | 用于检测数据错误的校验和,覆盖头部和数据部分。 |
紧急指针(Urgent Pointer) | 16 | 如果设置了URG标志,则指出紧急数据的末尾。 |
seq(确认号)=x
A--------------》》B
《《----------------- 确认号x+1 希望A 下次发的数据包序号为x+1
seq=x+1
------------------》》
确认号的作用:告诉对方我收到了你的消息 确认机制
控制位:描述了AB两台电脑目前处于什么状态
tcp 先要建立连接
A B
1没有建立连接
2已建立连接
3断开连接
URG(紧急位):当该位被置为1时,表示紧急指针有效。紧急指针字段指出紧急数据的末尾。
紧急数据通常用于通知接收方有需要立即处理的信息。
表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
ACK(确认位):当该位被置为1时,确认号字段有效。这意味着发送方已经收到了之前的数据,并且正在期待接收方的下一个序列号的数据。所有的连接建立、数据传输和连接终止都必须使用ACK标志
表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
PSH(急切位):当该位被置为1时,要求接收方立即将数据提交给上层应用程序,而不是等待缓冲区填满后再进行
提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
RST(重置位):当该位被置为1时,表示连接出现严重错误或者异常,需要重新初始化连接状态。
RST标志通常在网络故障、非法数据包或连接超时等情况下使用
如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
SYN(同步位):当该位被置为1时,表示这是一个连接请求或连接接受报文。在三次握手过程中,SYN标志用于同步序列号
在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
FIN(断开位):当该位被置为1时,表示发送方已经没有更多的数据要发送,希望关闭连接。
在四次挥手过程中,FIN标志用于结束数据传输
表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段
窗口大小: 调节每次发送的数据包量
服务端和客户端之间会根据实际情况 自动调节数据包的个数
工作在传输层
面向连接协议
全双工协议
半关闭
错误检查(校验)
将数据打包成段,排序 (给数据排序,确定数据来源于哪一台主机)
确认机制,对面每发一个包,我会告诉对面我收到了
数据恢复,重传
流量控制,滑动窗口
TCP建立连接的过程称为三次握手
为什么要是三次?
确保数据能够到达,2次不够,4次多余,三次正好
客户端主动发起请求报文,其中报文序号是随机产生的x,并且报文中的控制位SYN=1,代表请求建立连接
当服务端收到请求建立连接的报文会回复一个报文会产生是随机序号y,生成一个确认号值为客户端请求报文的序号+1(x+1),然后控制位SYN=1,ACK=1代表同意建立连接
当客户端收同一建立连接的报文时,会回复一个确认报文,会按照对方要求 产生序号为x+1,再生成一个确认号值为对方报文的序号+1(y+1),最后控制位的ACK=1,代表收到对方同意连接的请求
pc1 pc2
1发送SYN报文(seq=x,SYN=1)
2发送SYN+ACK报文(seq=y,ack=x+1,SYN=1,ACK=1)
3发送ACK报文(seq=x+1,ack=y+1,ACK=1)
当pc1想和pc2建立起连接 将 连接信息写入报文
第一步 :pc1会发送一个 建立连接的请求报文 : 这个报文中 有
报文的序号(seq=x)
同步位(请求建立连接关系: SYN=1 ACK=0 控制位:当前两台机器处于什么状态? 建立连接 处于连接 断开连接 )
第二步: 当pc2 收到消息以后 是不是要回复一个报文
报文的序号 (seq=y)
ack确认号( 我希望你下一次发送 x+1 序号的报文给你 )
控制位 SYN=1 ACK=1 请求建立连接 pc2 同意建立连接
第三步:收到 pc2 同意建立连接的报文后
1.会发送一个x+1报文
2.会告诉对方 我希望你下次 发送y+1的序号报文给我
3.最后 将ACK=1 封装进去 告诉我收到你的同意请求
四次挥手(Four-way Handshake)是TCP(Transmission Control Protocol)协议用于终止连接的过程。这个过程确保了双方都知道对方已经准备好关闭连接,防止数据丢失和资源浪费。
挥手为什么需要四次?
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
(一)主动关闭方发送FIN:
主动关闭方(通常是客户端或发起断开请求的一方)向被动关闭方(通常是服务器端或接收到断开请求的一方)发送一个FIN=1的报文段。这个报文段表明主动关闭方没有更多的数据要发送,并进入FIN-WAIT-1状态。
(二)被动关闭方回复ACK:被动关闭方接收到FIN报文段后,返回一个带有ACK=1的报文段,确认收到了主动关闭方的断开请求。此时,被动关闭方会将未完成的数据发送给主动关闭方,然后进入CLOSE-WAIT状态。
(三)被动关闭方发送FIN:当被动关闭方完成了所有数据的发送后,它也会向主动关闭方发送一个FIN=1的报文段,表示自己也准备好关闭连接。这时,被动关闭方进入LAST-ACK状态。
(四)主动关闭方回复ACK:主动关闭方接收到被动关闭方的FIN报文段后,返回一个带有ACK=1的报文段,确认收到了被动关闭方的断开请求。这时,主动关闭方进入TIME-WAIT状态,等待一段时间以确保最后一个ACK能够到达被动关闭方。
(五)被动关闭方关闭连接:被动关闭方接收到主动关闭方的ACK报文段后,可以安全地关闭连接。
(六)主动关闭方关闭连接:在TIME-WAIT状态等待一段时间后,如果主动关闭方没有收到任何数据包,则认为最后一个ACK已经成功送达,可以安全地关闭连接。
通过这个四次挥手的过程,TCP能够确保双方都已准备好关闭连接,避免了因一方错误关闭连接而引发的问题
tcp | udp | |
是否连接 | 面向连接 | 不连接 |
是否可靠 | 可靠,传输使用流量控制和拥塞控制 | 不可靠,不使用流量控制和拥塞控制 |
传输方式 | 面向字节流 | 面向报文 |
传输效率 | 慢 | 快 |
使用场景 | 适用于要求可靠传输的应用,例女文件传输 | 适用于实时应用 (IP电话、视频会议、直播等) |
UDP(User Datagram Protocol)用户数据报协议是一种无连接的传输层通信协议,它不保证数据包的顺序、可靠性和完整性。
udp 69 tftp 简易文件传输协议
111 rpc 远程过程调用
123 ntp 网络时间协议
远程连接协议(远程管理协议)
作用:探测远端服务器端口是否打开