TCP协议
“传输控制协议”(Transmission Control Protocol),是对应用程序数据的传输进行控制,简称TCP。
TCP首部格式
内容 | 说明 |
---|---|
源/目的端口号 | 表示数据是从哪个进程来, 到哪个进程去 |
32位序号/32位确认号 | 实现确认应答机制,以及进行包序管理 |
4位TCP报头长度 | 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是60字节 |
URG | 紧急指针是否有效 |
ACK | 确认号是否有效 |
PSH | 提示接收端应用程序立刻从TCP缓冲区把数据读走 |
RST | 对方要求重新建立连接; 也称为复位报文段 |
SYN | 请求建立连接; 也称为同步报文段 |
FIN | 通知对方, 本端要关闭了, 也称为结束报文段 |
16位窗口大小 | 用于实现滑动窗口机制,进行流量控制 |
16位校验和 | 二进制反码求和算法,校验数据接受与发送的一致性 |
16位紧急指针 | 标识哪部分数据是紧急数据 |
40字节头部选项 | 通常用于协商一些信息 |
6位保留位 | 预留着用于以后扩展 |
面向连接
经典的TCP三次握手建立连接,四次挥手断开连接
服务端调用listen监听套接字进入LISTEN状态,等待客户端的连接;
客户端调用connect,发送连接建立请求(同步报文段),并且进入SYN_SENT状态,等待服务端的回复;
服务端监听到客户端的连接请求,就会将这条连接请求进行回复。回复的是SYN确认报文,进入 SYN_RCVD状态;
客户端收到服务端的SYN确认报文之后,进入 ESTABLISHED状态,并且给服务端回复确认报文。
服务端也进入ESTABLISHED状态。
形象展示
四次挥手
当客户端和服务端都进入ESTABLISHED状态后,双方就可以开始进行传输数据了。
当数据传输完毕之后,客户端调用close套接字,向服务端发送FIN报文段,进入FIN_WAIT_1状态;
服务端收到发来的结束报文段,并向客户端回复确认报文段,进入CLOSE_WAIT状态;
客户端收到服务端发来的确认报文段,进入FIN_WAIT_2状态;
服务端调用close向客户端发送FIN报文段,并进入LAST_ACK状态;
客户端收到服务端发来的FIN报文段,进入TIME_WAIT状态;
服务端收到对FIN的确认报文,进入CLOSED状态,释放套接字。
客户端在等待最大报文生存时间之后,也进入CLOSED状态。
经典问题
1.TCP握手为什么是三次?为什么不能是二次或四次呢?
首先,TCP是双向通信,必须确保双方具有数据收发的能力的协议,如果客户端发送连接请求(同步报文段)之后,直接退出了,那么服务端在发送了SYN确认报文之后,没有收到回复,很显然,建立连接就是失败的。所以必须确保通信双方都在线。二次不安全,四次就太多余了没有不要把SYN和ACK分开发送。
2.TCP挥手为什么是四次?
发送FIN,只是表示不再给对方发送数据,不代表不再接受数据,因此被动关闭方对FIN确认回复之后,依然还有可能要发送数据
主动关闭方还可能回继续接收数据。
正因为如此,被动关闭方不能将ACK和FIN合成一个进行发送。
UDP协议
UDP首部格式
内容 | |
---|---|
16位源端口/目的端口 | 负责实现应用程序间的数据传输 |
16位数据包长度 | 包括UDP报文头部在内的整体报文长度,存储最大数字时65535 |
16位校验和 | 二进制反码求和算法,用于校验收到的数据和发送的数据是否一致 |
UDP特点
无连接
通信时,不需要建立连接,只需要告诉对方的地址信息,就可以直接发送数据。
不可靠
通信时,不保证数据安全可靠以及有序地到达对端
面向数据报
无连接的,不可靠的,有最大传输长度限制的一种传输方式
UDP的缓冲区
UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后
续的传输动作;
UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
UDP的socket既能读, 也能写, 叫做全双工。
对上层编程的影响
- 若sendto传输的数据(应用层的原始数据)大小大于64k-8(UDP报文头部长度是8个字节),则传输就会报错。因此若数据过长,需要程序员在应用层自己手动将大数据风格橙一个个的小的数据段(不大于64k-8)进行sendto发送。
- 因为UDP并不保证数据有序到达,在上层程序员进行数据分包之后,就要考虑在应用层实现各个数据段的包序管理。
- UDP报文都是整条收发的,因此UDP在使用recvfrom获取数据的时候,给的buffer就要足够大,防止出现数据过长给的buffer不够而报错,接收失败的情况。
基于UDP的应用层协议
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议