网络编程
TCP和UDP的区别
TCP | UDP |
提供面向连接的传输,通信前客户端和服务器之间必须建立TCP连接(三次握手机制) |
UDP提供的是无连接的传输,通信之前双方不必建立连接 |
提供可靠性传输,超时重发,丢弃重复数据,检验数据,保证数据能够从一端传输到另一端(不丢包,不重复,有序,无错) | 提供不可靠的传输,它只是把应用程序传给IP层的数据报发送出去,不能保证一定到达目的地 |
面向字节流的传输,因此能将信息分组,并在接收端重组 | 面向数据报的传输,无分组开销 |
提供拥塞机制,流量机制等 | 不提供这些机制 |
数据无边界 | 数据有边界 |
因为有超时重发,流量机制等,所以传输速率慢 | 没有超时重发机制,因而传输速率快 |
易被攻击,建立连接时有握手机制,易被利用,实现DOS攻击 | 较安全,没有那些机制,能利用的漏洞少 |
报头至少20个字节 | 报头8个字节 |
网络编程的一般步骤
TCP连接:
- 作为服务端:创建套接字create→绑定端口号bind→监听连接listen→接受连接请求accept,并返回新的套接字→用新的套接字接收/发送数据recv/send→关闭套接字close
- 作为客户端:创建套接字create→建立连接请求connect→发送/接收数据send/recv→关闭套接字close
UDP连接:
- 作为服务端:创建套接字create→绑定端口号bind→接收/发送数据recvfrom/sendto→关闭套接字close
- 作为客户端:创建套接字create→发送/接收数据sendto/recvfrom→关闭套接字close
TCP的三次握手和四次分手
三次握手示意图:
- 第一次握手是客户端connect连接到server,server accept client的请求之后,向client端发送一个消息,相当于说我都准备好了,你连接上我了,这是第二次握手,第3次握手就是client向server发送的,就是对第二次握手消息的确认。之后client和server就开始通讯了。
四次分手示意图:
- 断开连接的一端发送close请求是第一次握手,另外一端接收到断开连接的请求之后需要对close进行确认,发送一个消息,这是第二次握手,发送了确认消息之后还要向对端发送close消息,要关闭对对端的连接,这是第3次握手,而在最初发送断开连接的一端接收到消息之后,进入到一个很重要的状态time_wait状态,最后一次握手是最初发送断开连接的一端接收到消息之后。对消息的确认。
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你不可以马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。