TCP协议和UDP协议的对比:
TCP: 面向连接的 可靠的 字节流服务
UDP: 无连接 不可靠 数据报服务
TCP 服务器必须给每个连接分配资源
UDP 服务器不需要给每个连接分配资源
TCP 字节流服务
数据没有发送与接收界限。send 的次数和 recv 的次数没有关系。一次 send 发送的数据在网络中通过几个 TCP 报文段传输是不确定的。如果一次 recv 没有将接受缓冲区中的数据读取完成,则剩余数据继续保存在接收缓冲区中。
UDP数据报服务:
数据是一段一段的。发送方 sendto 的次数和接收方接收数据的次数是相等的。sendto 一次发送的数据由接收方一次 recvfrom 获取如果一次 recvtrom 没有将 UDP 报文段中的数据读取完成,则剩下的数据会被丢弃。
面向连接:
在通讯双方传递数据之前,必须先建立连接,操作系统内核会为连接分配一定的资源
在数据发送完之后,必须断开连接,释放连接资源,TCP 的服务器性能有待优化
同步通讯双方的序号,使得对方都能知道接下来发送的数据的序号值。
连接的过程:
三次握手过程 客户端主动发起链接
不能两次握手:
1、如果没有最后一个ACK,服务器会不断超时重传 ACK/SYN
2、会浪费服务器的资源(SYN 溢出攻击,因为网络环境的影响,客户端的 SYN 会被重传多次)
三次握手的含义
防止 SYN 溢出攻击,服务器端系统会为每一个链接分配资源,从而浪费服务器的资源
服务器实现三次握手在 listen 函数之后,accept 之前,由系统内核来完成三次握手交互
listen (int listenfd, size_t size);
size+1: 指定内核维护的已完成三次握手,但没有被应用程序处理的连接的个数
accept: 从已完成三次握手的连接队列里获取一个连接。
客户端在 connect 完成三次握手
断开连接过程,四次挥手过程
TCP 的网络通讯是全双工通讯,主动方发送一个 FIN 只能完成主动方到被动方的传输信道关闭,AIP 被动方发送 FIN 关闭被动方到主动方的传输信道。
三次挥手也是可以:被动断开方一次性向主动断开方同时发送 ACK 和 FIN
TIME_WAIT 和 CLOSE_WAIT 的区别:
CLOSE_WAIT 处于被动断开方,TIME_WAIT 处于主动断开发
TIME_WAIT:程序关闭,但是端口号没有释放
1、可靠的终止 tcp 链接
2、保证迟来的数据能被识别并丢弃
客户端和服务端断开链接时,客户端的发送缓冲区和服务器的接受缓冲区断开连接,服务器的发送缓冲区和客户端的接受缓冲区断开连接
四次挥手服务端和客户端同时断开链接
TCP可靠性
可靠传输的实现
滑动窗口、超时重传、拥塞控制
1、数据能够完全到达对端 (面向连接 32 位确认号 超时重传 滑动窗口(窗口大小有16 位窗口大小)拥塞控制 网络环境 )
2、到达的数据能不乱序、不重复(32 位序号)
3、数据不能出错 (16 位校验和 包括 TCP 头部以及数据部分 CRC)
TCP报头
TCP 报头最小 20 字节,最大 60 字节
源端口号:16 位长,发送方端口号
目的端口号:16 位长,接收端端口号
32 位序号: 保证数据不乱序,不重复。
32 位确认号: 确认机制,接受到的数据报文 +1 发送给发送方
4 位头部长度: 确定头部和携带的数据
6 位标记:URG:紧急指针有效。
ACK:确认报文段。ACK 为 1 表明确认号是合法的。如果 ACK 为 0,那么数据报不包含确认信息,确认字段被省略。
PSH:通知对方应用层程序尽快将数据处理,因为后续会有大量的数据到来。
RST:用于复位由于主机崩溃或其它原因而出现的错误的连接。还可以用于拒绝非法的数据报或拒绝连接请求。
SYN:用于建立连接。
FIN:用于释放连接。
16 位窗口大小:流量管控,接收通告窗口, 用于通知对方本端 TCP 接受缓冲区还能接收的数据长度,使得发达数据方能够控制发送数据的速度。
16 位校验和:对整个 TCP 报文段,即 TCP 头部和 TCP 数据进行校验和计算,并由目标端进行验证,保证数据不出错。
16 位紧急指针:它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
选项:长度不定;但长度必须以字节记;选项的具体内容我们结合具体命令来看;