面试专题-网络编程

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 服务器内部错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值