计算机网络
TCP
TCP基本认识
TCP头格式
- 序列号:初始值为随机数,通过SYN包传送,不断累加
- 确认应答号:发送端收到确认应答就可以确定该序号之前的数据没有丢包
- 控制位:
- ACK:1代表确认应答的字段为有效
- RST:1代表出现异常要断开连接
- SYN:1代表希望建立连接
- FIN:1代表希望断开连接
为什么需要TCP协议?
原因:要保障⽹络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责
连接:
Socket由IP和端口号组成
TCP 四元组
源地址和⽬的地址的字段(32位)是在 IP 头部中,作⽤是通过 IP 协议发送报⽂给对⽅主机。
源端⼝和⽬的端⼝的字段(16位)是在 TCP 头部中,作⽤是告诉 TCP 协议应该把报⽂发给哪个进程。
什么是TCP?
什么是TCP连接?
⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗⼝⼤⼩称为连接。
UDP 和 TCP 有什么区别呢?
- TCP是面向连接的传输层协议,传输前要建立连接;一对一的连接,即一条连接只有两个端点;TCP首部在没有使用
选项字段时是20字节…… - UDP不需要连接,即可传输数据;支持多对多连接;UDP首部(头部)占8个字节……
为什么 UDP 头部有「包⻓度」字段,⽽ TCP 头部没有「包⻓度」字段?
包长度:⾸部的⻓度跟数据的⻓度之和
原因:TCP数据长度 = IP总长度 - IP首部长度 - TCP首部长度
其中 IP 总⻓度 和 IP ⾸部⻓度,在 IP ⾸部格式是已知的。TCP ⾸部⻓度,则是在TCP ⾸部格式已知的,所以就可以求得 TCP 数据的⻓度。
TCP连接建立
三次握手
一开始客户端和服务端都处于CLOSED,要开始建立连接时,服务端处于LISTEN状态
第一个报文:客户端初始化client_isn置于TCP首部「序号」字段,「SYN」置1,然后发送该SYN报文,不包含应用层数据
第二个报文:服务端收到报文,初始化server_isn置于TCP首部「序号」字段,「确认应答号」置client_isn+1,「SYN」、「ACK」置1,然后发送该SYN+ACK报文,不包含应用层数据
第三个报文:服务端收到报文,「ACK」置1,「确认应答号」填入server_isn+1,然后发送该报文,可以携带数据
完成三次握手后,双方都处于ESTABLISHED状态,连接建立
如何在 Linux 系统中查看 TCP 状态?
netstat -napt
为什么是三次握⼿?不是两次、四次?