,TCP UDP 区别:
TCP 有点: 可靠, 稳定, TCP 可靠提现在 TCP 在传递数据之前, 会有三次握手来建立连接, 而且在数据传输时, 有确认, 窗口, 重传, 拥塞控制机制, 在数据传完后, 还会断开连接来节约系统资源.
TCP 缺点: 慢, 效率低, 占用系统资源高, 易呗攻击, TCP 在传递数据之前, 要先建立连接, 这会消耗时间, 而且在数据传输时, 确认机制, 重传机制, 拥塞机制等都会消耗大量的时间, 而且要再每台设备上维护所有的传输连接, 事实上, 每个连接都会占用系统的 CPU, 内存等硬件资源, 而且, 因为 TCP 有确认机制, 这些也导致 TCP 容易被人利用, 实现 DOS,DDOS,CC 等攻击.
UDP 优点: 快, 比 TCP 稍安全, 没有 TCP 的握手, 确认, 窗口, 重传, 拥塞控制等机制, UDP 是一个无状态的传输协议, 所以在传递数据时非常快, 没有 TCP 的这些机制, UDP 较 TCP 被攻击者利用的漏洞就要少一点. 但 UDP 也是无法避免攻击的, 比如 UDP Flood 攻击...
UDP 缺点: 不可靠, 不稳定 因为 UDP 没有 TCP 那些可靠的机制, 在数据传递时, 如果网络质量不好, 就会容易丢包.
TCP | UDP | |
是否连接 | 面向连接(TCP 三次握手) | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
应用场合 | 少量数据,安全(浏览器 HTTP、FTP Outlook、SMTP Putty) | 传输大量数据(QQ 语音、视频、直播等) |
速度 | 慢 | 快 |
2,TCP 三次握手和四次挥手
三次握手:
初始状态: 客户端 A 和服务器 B 均处于 CLOSED 状态, 然后服务器 B 创建 socket, 调用监听接口使得服务器处于 LISTEN 状态, 等待客户端连接.(后续内容用 A,B 简称代替)
A 首先向 B 发起连接, 这时 TCP 头部中的 SYN 标识位值为 1, 然后选定一个初始序号 seq=x(一般是随机的), 消息发送后, A 进入 SYN_SENT 状态, SYN=1 的报文段不能携带数据, 但要消耗一个序号.
B 收到 A 的连接请求后, 同意建立连接, 向 A 发送确认数据, 这时 TCP 头部中的 SYN 和 ACK 标识位值均为 1, 确认序号为 ack=x+1, 然后选定自己的初始序号 seq=y(一般是随机的), 确认消息发送后, B 进入 SYN_RCVD 状态, 与连接消息一样, 这条消息也不能携带数据, 同时消耗一个序号.
A 收到 B 的确认消息后, 需要给 B 回复确认数据, 这时 TCP 头部中的 ACK 标识位值为 1, 确认序号是 ack=y+1, 自己的序号在连接请求的序号上加 1, 也就是 seq=x+1, 此时 A 进入 ESTABLISHED 状态, 当 B 收到 A 的确认回复后, B 也进入 ESTABLISHED 状态, 至此 TCP 成功建立连接, A 和 B 之间就可以通过这个连接互相发送数据了.
四次挥手:
初始状态: 客户端 A 和服务器 B 之间已经建立了 TCP 连接, 并且数据发送完成, 打算断开连接, 此时客户端 A 和服务器 B 是等价的, 双方都可以发送断开请求, 下面以客户端 A 主动发起断开请求为例.(后续内容用 A,B 简称代替)
A 首先向 B 发送断开连接消息, 这时 TCP 头部中的 FIN 标识位值为 1, 序号是 seq=m,m 为 A 前面正常发送数据最后一个字节序号加 1 得到的, 消息发送后 A 进入 FNI_WAIT_1 状态, FIN=1 的报文段不能携带数据, 但要消耗一个序号.
B 收到 A 的断开连接请求需要发出确认消息, 这时 TCP 头部中的 ACK 标识位值为 1, 确认号为 ack=m+1, 而自己的序号为 seq=n,n 为 B 前面正常发送数据最后一个字节序号加 1 得到的, 然后 B 进入 CLOSE_WAIT 状态, 此时就关闭了 A 到 B 的连接, A 无法再给 B 发数据, 但是 B 仍然可以给 A 发数据 (此处存疑), 同时 B 端通知上方应用层, 处理完成后被动关闭连接. 然后 A 收到 B 的确认信息后, 就进入了 FIN_WAIT_2 状态.
B 端应用层处理完数据后, 通知关闭连接, B 向 A 发送关闭连接的消息, 这时 TCP 头部中的 FIN 和 ACK 标识位值均为 1, 确认号 ack=m+1, 自己的序号为 seq=k,(B 发出确认消息后有发送了一段数据, 此处存疑), 消息发送后 B 进入 LACK_ACK 状态.
A 收到 B 的断开连接的消息后, 需要发送确认消息, 这是这时 TCP 头部中的 ACK 标识位值为 1, 确认号 ack=k+1, 序号为 m+1(因为 A 向 B 发送断开连接的消息时消耗了一个消息号), 然后 A 进入 TIME_WAIT 状态, 若等待时间经过 2MSL 后, 没有收到 B 的重传请求, 则表明 B 收到了自己的确认, A 进入 CLOSED 状态, B 收到 A 的确认消息后则直接进入 CLOSED 状态. 至此 TCP 成功断开连接.
3,socket 理解:
socket 本质是编程接口 (API), 对 TCP/IP 的封装, TCP/IP 也要提供可供程序员做网络开发所用的接口, 这就是 Socket 编程接口;
View Code
来源: http://www.bubuko.com/infodetail-3113707.html