TCP/IP 协议
TCP工作在网络OSI七层模型中的第四层--传输层,IP在第三层--网络层。
应用层法下来,每一层都会添加头部信息进行封装,然后在发送到接收端。
TCP 协议格式
- TCP 段
TCP首部 | 用户数据 |
---|
TCP段大小也是有限制的,最大为1460字节
- 以太网帧
以太网首部 | IP首部 | TCP首部 | 用户数据 |
---|---|---|---|
22字节 | 最小20字节 | 最小20字节 | 最多1460字节 |
最终由网卡发送出去的数据包叫以太网帧,以太网帧的大小固定是1522字节,而IP首部和TCP首部的大小是不固定的,但最少会各占20字节,所以TCP段搭载的数据大小最多为1460字节。
TCP 三次握手
三次握手目的不是为了打通网络连接,而是在正式使用之前检测网络是否通畅。
TCP在三次握手时,会确认发送数据包的单位,也就是发送的最大消息长度(MSS:Maximum Segment Size),TCP在进行大力量数据传送时,就是以MSS的大小将数据进行分割发送。
-
第一次握手
首先客户端发起连接请求,向服务器发送TCP段,段中包含目标端口和本机端口,设置SYN标志位为1,序号为 x,也就是初始序号 ISN,如果是第一个连接,很有可能就是 0。当然,此时服务器对应的端口要处于监听状态。此时,客户端进入 SYNC_SENT 状态,等待服务器的确认。 -
第二次握手
服务端收到客户端发来的 SYN 段,对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1),这就是确认序号。同时,服务端还要发送 SYN 请求信息,将SYN位置为1,Sequence Number为 y(服务端的TCP段序号)。服务器端将上述所有信息放到一个TCP段(即SYN+ACK段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。 -
第三次握手
客户端接收到服务端发来的 SYN+ACK 段后,发送一个 ACK 给服务端,将 Acknowledgment Number 设置为 y+1。此时客户端进入 ESTABLISHED(已连接)状态,服务端接收到此 TCP段,也将进入 ESTABLISHED 状态,也就标志着三次握手结束,连接成功建立。
三次握手完成之后,连接就建立了,之后就可以开始传输数据了。
TCP 四次挥手
当客户端和服务端双方发送数据完成之后,一般由客户端主动发起断开连接请求,当然,也有少数情况是服务器主动发起。
-
第一次挥手
客户端设置序号(Sequence Number)和确认序号(Acknowledgment Number),发送一个 FIN 段给服务器。这时,客户端进入 FIN_WAIT_1状态,意味着客户端没有数据要发送了。 -
第二次挥手
服务端收到 FIN 报文段,向客户端发送一个 ACK 段,客户端进入 FIN_WAIT_2 状态。表示服务端已同意连接关闭请求。 -
第三次挥手
服务端向客户端发送 FIN 段,请求关闭连接,同时服务端进入 LAST_ACK 状态。 -
第四次挥手
客户端收到服务端发来的 FIN 段,向服务端发送 ACK 段,之后客户端进入TIME_WAIT状态。服务端收到客户端的ACK 段以后,就关闭连接。
上面就是由客户端主动发起关闭连接的过程。
TCP 与 UDP 对比
- TCP是面向连接的,UDP是无连接的
- TCP是可靠的,UDP是不可靠的
- TCP是面向字节流的,UDP是面向数据包文的
- TCP只支持点对点通信,UDP支持一对一,一对多,多对多
- TCP报文首部20个字节,UDP首部8个字节
- TCP有拥塞控制机制,UDP没有
- TCP协议下双方都有发送、接收缓冲区,UDP没有实际意义上的发送缓冲区,但有接收缓冲区
要求输出内容可靠,不丢包,则选择使用TCP传输
对于某些数据量大、实时性要求较高的情况,选择UDP传输