socket网络编程:传输层详解(TCP / UDP)
Posted py-xiaoqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket网络编程:传输层详解(TCP / UDP)相关的知识,希望对你有一定的参考价值。
8.2 传输层详解 TCP/UDP
作为软件程序猿,我们只能决定应用层的协议用什么。其他层都是固定的
TCP
- TCP协议又称Stream协议(流式协议):像水流一样传递,所以需要一个双向管道
- 建立连接(挖管道):(3次握手)
- 1次握手:客户端向服务端发一个请求(SYN=1,Seq=x):我要去连接你,可以吗? →
- 2次握手:服务端回复客户端的请求(ACK=1,Seq=x):可以。 同时,服务端向客户端发一个请求(SYN=1,Seq=y):我也要连接你,可以吗?
3次握手:客户端回复服务端的请求(ACK=1,Seq=y):可以。
这样就建立了双向的连接
- 断开连接:由于服务端传向客户端的数据不一定传完,所以需要4步(4次分手)
- 1次:客户端向服务端发送结束请求(FIN=1)
2次:服务端回复客户端的请求(ACK=1)
在这里服务器会把传向客户端的数据传完才发送断开请求
- 3次:服务端向客户端发送请求(FIN=1)
4次:客户端回复服务端的请求(ACK=1)
- 建立连接(挖管道):(3次握手)
SYN = 1 表示这是一个请求
ACK = 1 表示这是一个确认
seq = x 表示序列号是x,用来确认服务端是刚才我发送的服务端的回复
TCP是可靠协议,什么是可靠协议呢? 可靠指定是:当发送方发送数据给接受端的时候,另一端一定会回复一个信息告诉发送方我已经收到。如果发送方没收到回复,就重发。
- TCP特点:
- 传输效率低
数据传输可靠
TCP协议又称流式协议(STREAM),因为数据是以流式发送的,所以会发生粘包现象
- 流式协议:
- 会发生粘包现象
- 不能发送空数据
- 发送和接受可以是多对多
UDP
- UDP不需要挖管道(没有连接存在),只要知道目标,直接发包,不确认对方是否收到。
- UDP传输速度很快:不需要建立连接,不需要确认对方是否收到
不可靠协议(如果网络等出现问题,很可能丢包)
UDP协议又称数据报协议(DataGRAM),不会发生粘包现象
- 数据报协议:
- 不会发生粘包现象
- 可以发送空数据(自带报头,所以实际上数据不是空)
- sendto和recvfrom是一对一关系
以上是关于socket网络编程:传输层详解(TCP / UDP)的主要内容,如果未能解决你的问题,请参考以下文章