网络编程,TCP和UDP,TCP三次握手,四次分手

TCP和UDP的区别

TCPUDP

提供面向连接的传输,通信前客户端和服务器之间必须建立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一定收到消息。
    
    若四次握手,就造成了浪费,因为在第三次握手之后,就能确保双方发送的消息对方都可以收到。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值