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报文。
3. TCP 为什么要三次握手,两次、四次不行吗?为什么?
首先,解释一下全双工,半双工,单工的概念。
全双工:客户端A可以给服务端B发送消息,服务端也可以给客户端发送消息,客户端给服务器发送消息的同时服务端也可以给客户端发送消息。
半双工:客户端A可以给服务端B发送消息,服务端也可以给客户端发送消息,但是A给B发送的同时,B不能给A发送消息,即不能同时。
单工:A可以给B发送消息,B不可以给A发送,或者B可以给A发送消息,A不可以给B发送。
TCP是全双工的,发送一次信息即一次握手。
●第一次握手:A给B发送消息,你能收到我的消息吗(SYN)
●第二次握手:B收到了A的消息(ACK),然后给A发送消息,那你能收到我的消息吗(SYN)
●第三次握手:A收到了B的消息(ACK),然后给B说可以的,我们可以开始通讯了。
三次握手后,就可以保证A能收到B的消息,B也可以收到A的消息,这样可以开始通讯了。
HTTP是基于TCP协议的,客户端请求,服务器应答,但是TCP还可以给其他应用层提供服务,所以A,B建立连接后,双方都可以先开始通信。
若只有两次握手,假若B先开始通信,就不能保证B发送给A的消息,A一定收到消息。
若四次握手,就造成了浪费,因为在第三次握手之后,就能确保双方发送的消息对方都可以收到。