TCP vs UDP
TCP 是一种面向连接的、可靠的、字节流服务;
UDP 是无连接、不可靠的、数据报服务;
1. 连接方面: TCP 面向连接,交换数据之前必须通过三次握手先建立一个 TCP 连接。在
一个 TCP 中仅有两方彼此通信,多播和广播不能用 TCP。 UDP 是不可靠的传输,传输前不
需要建立链接,可以应用多播和广播实现一对多的通信。
2. 可靠性: TCP 提供端到端的流量控制,对收到的数据进行确认,采用超时重发,对失序
的数据进行重新排序等机制保证数据通信的可靠性。而 UDP 是一种不可靠的服务,接收方
可能不能收到发送方的数据报。
3.TCP 是一种流模式的协议, UDP 是一种数据报模式的协议。进程的每个输出操作都正好
产生一个 UDP 数据报,并组装成一份待发送的 IP 数据报。 TCP 应用程序产生的全体数
据与真正发送的单个 IP 数据报可能没有什么联系。
4. 效率上:一般 TCP 速度慢,传输过程中需要对数据进行确认,超时重发,还要对数据进
行排序。 UDP 没有这些机制所以速度快。数据比例, TCP 头至少 20 个字节, UDP 头 8
个字节,系统组装上 TCP 相对慢。
5. 用途上:用于 TCP 可靠性。而 UDP 速度快,视频,在线游戏多用UDP ,保证实时性。
印象笔记:
上图中有几个字段需要重点介绍下:
(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
需要注意的是:
(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认方Ack=发起方Req+1,两端配对。
TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收
当某个主机开启一个TCP会话时,他的初始序列号是随机的,可能是0和4,294,967,295之间的任意值,然而,像Wireshark这种工具,通常显示的都是相对序列号/确认号,而不是实际序列号/确认号,相对序列号/确认号是和TCP会话的初始序列号相关联的。这是很方便的,因为比起真实序列号/确认号,跟踪更小的相对序列号/确认号会相对容易一些
序列号为当前端成功发送的字节数,确认号为当前端成功接收的字节数
参考书:1.tcp三次握手(建立连接)
tcp的三次连接发送在客户端connect,服务端listen之后就开始三次握手了,不管服务端有没有accept都会连接成功,因为服务端listen之后就有一个队列保存连接socket,accept成功只是给你分配一个socket。
最近看完了TCP/IP详解后,发现自己的理解是错的,真正的对应关系是这样的。
- 服务器调用listen进行监听
- 客户端调用connect来发送syn报文
- 服务器协议栈负责三次握手的交互过程。连接建立后,往listen队列中添加一个成功的连接,直到队列的最大长度。
- 服务器调用accept从listen队列中取出一条成功的tcp连接,listen队列中的连接个数就少一个
- 注:listen的函数形式int listen(int sockfd, int backlog);
backlog代表listen队列的长度。
参考书:2.四次握手(挥手)(终止tcp连接)
RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
TIME_WAIT状态存在理由:
(1):可靠地实现TCP全双工连接的终止;
(2):允许老的重复分节在网络中消失;
网络来源:1.tcp三次握手(建立连接)
三次握手:指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
(1)第一次握手:
Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:
Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:
Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
SYN攻击:
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
2.四次握手(挥手)(终止tcp连接)
四次挥手:断开一个 tcp连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发