TCP三次握手与四次挥手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种表示:
SYN(synchronous建立连接)
ACK(acknowledgement 表示响应、确认)
PSH(push表示有DATA数据传输)
FIN(finish关闭连接)
RST(reset表示连接重置)
URG(urgent紧急指针字段值有效)
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。另外:握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP
连接都将被一直保持下去。
四次挥手
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
作用
确认双方的接收功能和发送功能十分都正常
为什么握手是三次挥手是四次
挥手时,当服务器接收到客服端的的FIN报文后,因为服务器很可能不会立刻关掉连接,可能还要报文没有发送完,所以先向客服端发送ACK报文,等报文发送完,再发送FIN报文。而握手时,可以直接发送SYN+ACK报文
TCP 和 UDP 区别,优缺点?
协议层
TCP是面向连接协议,有确认重传机制,有流量控制机制等,UDP是无连接的,尽力而为的传输数据,重传有上层协议来控制。
从头部来讲,TCP有选项部分,所以有首部长度,而UDP没有选项部分,没有首部长度,可以存更多数据
应用层
TCP是可靠的连接,由于有重传机制,可以确保数据完整的从A到B,但因为握手挥手,发送跟多包,浪费带宽,服务器需要维持大量的并发连接,浪费系统资源,在不好网络时候,可能会不断连接,断开连接,严重减低传输效率
相对TCP,UDP是不可靠协议,因为不用三次握手,连接起步快,没有额外带宽浪费,服务器不用维护大量并发连接,
为什么要有UDP
TCP适合实时性不高,且要求传输内容完整的应用,相比TCP,UCP无连接,无重传确认,所以传输效率高,适合实时要求高的应用,比如游戏服务器,音频,视频等。还有UDP不需要维护大量的并发量,适合做巨量服务的服务器
TCP的沾包和拆包问题
TCP是以流形式来传输数据的,一个完整的包可能被拆成多个包进行发送,也可能多个完整的包合并成一个大包进行发送
原因
应用程序写入的字节大小大于套接字缓存区的大小,会发生拆包现象,而应用程序写入的字节大小小于套接字缓存区的大小,网卡会将应用多次写入的数据一起发送到网络上,这将发生沾包现象
解决办法
消息定长,比如每个报文固定200字节,如果不够,空格补
在包尾增加回车换行符进行分割,如ftp协议
TCP是怎么保持连接的
TCP有KeepAlive机制,自动检测能否和对方连接并保持连接
TCP是怎么识别不同请求的
每次建立连接,都会保留唯一的套接字,有这个套接字,就知道对方的ip地址,端口等信息,这样通过这个套接字就能给指定用户发消息
常见的状态码及含义
1xx 请求成功,正常处理
2xx 请求成功,处理完成
3xx 重定向
4xx 请求语法错误
403 服务被拒,没有权限
404 找不到页面
5xx 服务器错误
500 服务器内部错误