网络编程常见问题汇总


TCP和UDP的区别?

首先,TCP和UDP都是传输层协议。

TCP是面向连接的(三次握手),UDP是面向无连接的;

TCP传输可靠(通过校验和、重传控制、序号标识、滑动窗口、确认应答等机制),UDP传输不可靠(TCP保证数据正确性,UDP可能丢包;TCP保证数据顺序,UDP不保证。);

TCP速度慢,UDP速度快(实时性好);

TCP应用在少量数据;UDP传输大量数据。

TCP是面向字节流的,UDP是基于数据报的;

TCP首部开销20字节,UDP只有8个字节。

TCP对系统资源要求较多、UDP对系统资源要求较少;

每条TCP连接只能是点对点的;UDP支持一对一、一对多、多对一、多对多的交互通信

需要资源少,网络情况稳定的内网,DHCP就是基于UDP协议的。

FTP客户端实现:

put上传文件、get下载文件

下载缓冲区的作用?

被动模式:首先客户端使用一个端口(假设为1955)连接服务端21端口,接着,客户端向服务端发送一个含有PASV命令的数据包给服务端,服务端收到这个数据包以后就知道,客户端以被动模式来传输数据。接着,服务端发送一个含有PORT 服务端地址的字符串数据包给客户端。

客户端在收到这个数据包后,从这个数据包中可以解出,服务端地址和开放的一个动态端口(假设为29318),然后客户端就会开放一个N+1端口(1956)去连接服务器的端口29318。

此时,就存两条连接:一条控制连接1955-21端口;一条1956到29318的数据连接。

控制连接用来发送i号令,数据连接用来传输数据。

所谓被动模式,就是服务器给一个端口,让客户端去连接;主动模式,是客户端拿20端口去服务端连接。

通过send()发送命令,通过recv()接收数据。

缓冲区的作用?

因为,write()和send()并不是立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓存区送到目的主机(磁盘)。

网络IO问题。网卡与内存之间

因为,直接内存到磁盘的速率不同,所以,为了提高传输效率,设置缓冲区。

Time_wait状态是什么?或如何产生的?

首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait状态。即主动发起关闭请求的一方会出现该状态。
也就是说该发送发会保持2MSL时间之后才会回到初始状态,这个TCP连接在2MSL连接等待期间不能被使用。因此,服务器首先主动发起close()关闭连接,然后关闭客户端,再次启动服务端会存在2MSL时长不能重启成功。

Time_wait状态有什么用?

实现TCP全双工连接的可靠释放:避免被动关闭连接的一方发送FIN失败后,重新传输FIN,主动关闭一方的TCP传输层会用RST包响应对方,会被对方认为是有错误发生,然而,这事实上只是正常的关闭连接过程,并非异常。
使旧的数据包在网络因过期而消失:假设当前一条TCP连接,因为某些原因,我们先关闭,接着很快以相同的四元组建立一条新的连接,因为TCP协议是无法区分前后两条TCP连接的不同,会看成同一条连接,将断开连接前的旧数据继续上传到应用层,从而引起数据错乱,进而导致无法预知现象。为了避免这种现象,而提出的这个状态。

TCP服务端编写步骤

1. socket()            创建socket
2. bind()              绑定服务器地址结构
3. listen()            设置监听上限
4. accept()            阻塞监听客户端连接
5. read()/write()      读写数据
6. close()             关闭连接

TCP客户端编写步骤

1. socket()            创建socket
2. connect()           与服务器建立连接
3. write()、read()      读写数据
6. close()             关闭连接

三次握手成功,对应编码层的什么操作

服务端accept()返回成功或客户端connect()返回成功。

什么是半关闭?

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,就是所谓的半关闭.

为什么需要半关闭?

保证数据的完全交换。告诉接收方,数据已经传送完毕,接收端不需要无休止的调用read()函数,因为这可能导致程序阻塞(调用函数未返回)。

对应shutdown()函数实现TCP套接字的半关闭。

什么时候处于半关闭

当四次挥手处于被动关闭的一方在收到主动关闭方的FIN时,进入CLOSE_WAIT状态,主动方收到对方的同意ACK后就会进入半关闭状态。

半关闭发生在主动关闭的一方。

半关闭完成对应编码层的什么操作

客户端close()后,服务端read()返回0,表示半关闭完成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值