网络——TCP协议和UDP协议的认识

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: 域名解析协议

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值