type
status
date
slug
summary
tags
category
icon
password
1. 端口
运输层使用 UDP 或 TCP 协议,实现源端口到目的端口的数据传输,为应用进程之间提供端到端的逻辑通信
发起通信请求,必须知道对方的服务器 IP 和 端口号
常用服务的默认端口号
2. UDP 和 TCP
用户数据报协议 UDP(User Datagram Protocol)
- 发送数据不需要建立连接
- 尽最大努力交付,不保证一定交付
- 对应用层传下来的报文添加首部后就交付给网络层
- 没有拥塞控制,允许网络阻塞时丢失一些数据(比如看直播时画面卡一下)
- 支持一对一、一对多、多对一、多对多
- 首部占用小,只需要8个字节
传输控制协议 TCP(Transmission Control Protocol)
- 发送数据前必须先建立TCP连接,传输完成后释放TCP连接
- 每条TCP连接都是点对点,端点叫做套接字(socket,即 IP地址 :端口号)
- 同一IP可以有多个不同的TCP连接,同一端口号可以用在多个不同的TCP连接中
- 连接的两端既发送报文,也接收报文,并设有缓存来存储将发送和已收到的数据
- 提供可靠服务,数据不会出错、丢失,并按顺序到达
- 把应用层传下来的数据看作无结构的字节流发送,接收方应用层再还原字节流
- 首部最少占用20个字节,最大60字节
3. 首部格式
UDP 首部
- 源端口:需要对方回信时选用,不需要时全0
- 目的端口:终点交付报文,必须使用,若目的端口不存在则丢弃
- 长度:记录UDP数据报长度,最短为8字节,即仅有首部,无数据部分
- 检验和:利用伪首部检测UDP数据报传输中是否出错,有错则丢弃
TCP 首部
- 源端口、目的端口:与UDP一样,各占2字节
- 序号:TCP字节流每个字节都按顺序编号,序号记录本段报文第一个字节的编号
- 确认号:期望收到对方下一个报文所应该的序号值
- 数据偏移:记录TCP首部长度,其字段值以 4个字节 为单位
- 保留:保留为今后使用,后面跟6个控制位
- 窗口值:告诉对方,从确认号开始允许发送的最大数据量,以1字节为单位
- 检验和:和UDP一样,加伪首部计算检验和
- 紧急指针:指出本段报文紧急数据的字节数
- 选项:一些可选的附加数据,最长40字节
4. TCP三次握手
- SYN:SYN=1表示该报文是一个连接请求,且不能携带数据
- ACK:当ACK=1时确认号才有效,建立连接后传送的报文必须都把ACK置为1
- 服务端B开启后,处于Listen监听状态,等待客户端的连接请求
- 客户端A发起请求,SYN置为1,选择一个起始序号seq,假设为x,由于不携带数据,因此只占用这一个序号
- 服务端B收到请求,发送确认给A,将ACK置为1,表示确认号ack生效,由于收到的报文没有数据,所以确认号 ack = x + 1,同时B也选一个初始序号seq,假设为y
- 客户端A收到B发送来的确认,A再发送一个确认给B,确认号为 ack = y + 1,序号为 seq = x + 1
- B收到A的确认,连接建立
5. TCP四次挥手
- FIN:连接终止,当FIN=1表示请求释放连接
- A发送请求关闭连接,FIN置为1,进入第一关闭等待状态
- B收到关闭请求,发送确认给A,并通知上层应用进程,不再接收来自A的数据
- A收到B的确认后,进入第二关闭等待状态,不再给B发送数据
- B发完给A最后的数据后,B也发送关闭连接请求,FIN置为1
- A收到B的关闭请求,最后给B再发送一次确认,然后进入时间等待状态
- B收到A最终确认,完全关闭连接
- A在时间等待状态内保证了最后一个确认能到达B,假如最后的确认丢失,B会再次发送FIN为1的请求,A再次发送最终确认,继续进入时间等待状态
- Author:风之旅人
- URL:https://www.hrmi.fun//article/tcp-ip
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!