Linux——TCP和UDP
一、TCP协议
1.特点
TCP提供的是面向连接、可靠的、字节流服务。
2.编程流程
(1)服务器端的编程流程
①socket() 方法创建套接字
②bind()方法指定套接字使用的IP地址和端口。
③listen()方法用来创建监听队列。
④accept()方法处理客户端的连接。
⑤recv()接收客户端发送的数据。
⑥send()向客户端发送数据。
⑦close()关闭连接。
(2)客户端的编程流程
①socket() 方法创建套接字
②connect()与服务器端建立连接。
③send()向服务器端发送的数据。
④recv()接收服务器发送的数据。
⑤close()关闭连接。
(3)注意点
TCP协议只允许一个服务器同时被一个客户端访问,如果想要多个客户端同时访问则需要使用多进程或者多线程处理。
①listen()监听队列,队列有两种,一个是存放未完成3次握手的连接,另一个是存放已完成3次握手的连接。listen()的第二个参数在Linux下表示的是已完成三次握手队列的长度。
②accept()是从已完成3次握手连接的队列中取数据。如果队列中此时没有连接,则会阻塞。
③connect()会进行3次握手,建立连接。
④send()表示已成功将数据发送到发送缓冲区中。
recv()表示从接受缓冲区中数据,如果缓冲区此时没有数据,则会阻塞。
⑤close()方法关闭TCP连接,会进行4次挥手。
3.三次握手和四次挥手
(1)三次握手(客户端connect)
首先,客户端向服务器端发送SYN数据包,表示请求建立连接。
然后,服务器回复ACK和SYN包,确认请求并同步连接参数。
最后,客户端再次确认,发送一个ACK包确认连接建好。
(2)四次挥手(close())
首先,主动断开方发送FIN包,表示没有数据要发送了。进入FIN_WAIT_1状态。
然后,被动断开方回复ACK确认。被动断开方进入CLOSE_WAIT状态,主动断开方接收到后,变为FIN_WAIT_2的状态。
接着,被动断开方也要准备关闭连接, 发送FIN给另一方。进入到LAST_ACK状态。
最后,另一方回复ACK确认。主动断开方变为TIME_WAIT 状态,被动断开方变为CLOSED状态。
4.对TCP特点的理解
(1)面向连接:连接时需要建立3次握手,4次挥手。
(2)可靠的 :提供应答确认、超时重传、乱序重排和去重的机制。
(3)字节流服务:发送的次数与接收的次数不一样。(因为几次发送的数据会被一次接收到)
二、UDP协议
1.特点
无连接、不可靠的数据报服务。
2.编程流程
(1)服务器端的编程流程
①socket() 方法创建套接字
②bind()方法指定套接字使用的IP地址和端口。
③recvfrom()接收客户端发送的数据。
④sendto()向客户端发送数据。
⑤close()关闭连接。
(2)客户端的编程流程
①socket() 方法创建套接字
②sendto()向服务器发送数据。
③recvfrom()接收服务器发送的数据。
⑤close()关闭连接。
(3)注意点
UDP协议允许一个服务器被多个客户端同时访问。
3.对UDP的理解
无连接:不需要建立连接,直接通过参数进行连接。
不可靠:不提供应答确认等机制。
数据报服务:发送的次数与接收的次数数目相同。因为发送端每执行一次写操作,UDP就将其封装成一个UDP数据报发送。它不会重新传入数据,会直接丢失数据。