四次挥手问题

在这里插入图片描述

  • 接收端接到FIN包执行被动关闭,FIN包由TCP协议栈,为FIN包插入到文件结束符EOF缓冲区,应用程序通过read调用感应FIN包。FIN包被放到已排队等候的其他已接受的数据之后,这表示EOF之后再无额外的数据到达,此时被动关闭方进入CLOSE_WAIT状态。
  • 被动关闭方读到EOF,应用程序调用close关闭它的套接字,导致它的TCP也会发送一个FIN包,被动关闭进入LAST_ACK状态
  • 主动关闭放收到FIB包,进入TIME_WAIT状态,并发送ack给被动关闭放,此时被动关闭放进入CLOSE状态,经过2MSL时间之后,主动关闭方也进入CLOSED状态
  • 使用shutdown执行一端到另一端的半关闭也是可以的
  • 当TCP发送的FIN包,大多数情况是由应用程序调用close发生的。一个进程无论正常退出(exit或者main函数返回),韩式非正常退出(SIGKILL信号关闭,就是我们常常干的kill-9),所有该进程描述符会被系统关闭,导致TCP描述符对应的连接上发送出一个FIN包
最大分组MSL是TCP分组在网络中存活的最长时间?
  • MSL是任何IP数据包能够在internet中存活的最长时间,他的实现不是靠计时器完成的,在每个数据报里都包含一个TTl(time to live)的8位字段,它的最大值为255。TTL“生存时间”,他表示一个IP数据报可以经过的最大跳跃数(每经过一个路由器值减1,当值为0则丢弃,同时发送ICMP报文通知源主机)。
关于listen函数中参数backlog的释义问题
  • backlog参数定义了该套接字对应的未完成连接队列最大长度,如果队列满了,客户端将收到一个ECONNREFUSED的错误信息,支持重传,该请求可能被忽略,然后重传
  • Linux2.2开始,backlog表示已完成连接队列的最大长度(等待accept调用返回),未完成队列最大长度值可以通过/proc/sys/net/ipv4/tcp_max_syn_backlog 完成修改,默认值为128.
  • 如果声明的backlog参数比 /proc/sys/net/ipv4/core/somaxconn的参数要大,就是用我们声明的值u
UDP连接和断开套接字的过程是怎样的?
  • UDP连接套接字不是发起连接请求的过程,而是记录目的地址和端口到套接字的映射关系
  • 断开套接字则相反,删除原来记录的映射关系
UDP不进行connect,为什么客户端会收到信息?

UDP 只有 connect 才建立 socket 和 IP 地址的映射,那么如果不进行 connect,收到信息后内核又如何把数据交给对应的 socket?

  1. ICMP报文和socket之间的定位。ICMP是不可达的信息(通过目的地址和端口来区分),如果没有connect操作,目的地址和端口就没有办法和socket套接字进行对应,所以即使收到了ICMP报文内核也没办法通知应用程序,告诉他连接地址不可达

为什么不在connect的情况下,客户端又可以收到服务端回显的信息?

2.场景2(报文发送场景):服务端程序先通过recvfrom函数调用获取客户端的地址和端口信息,因为UDP报文包含了这部分信息,然后服务器端又通过调用sendto函数,把客户端的地址和端口信息告诉了内核协议栈,之后发送的UDP报文就带上了客户端的地址和端口信息,通过客户端的地址和端口信息,就可以找到对应的套接字和应用程序,完成数据的收发。


//服务器端程序,先通过recvfrom函数调用获取了客户端的地址和端口信息
int n = recvfrom(socket_fd, message, MAXLINE, 0, (struct sockaddr *) &client_addr, &client_len);
message[n] = 0;
printf("received %d bytes: %s\n", n, message);

char send_line[MAXLINE];
sprintf(send_line, "Hi, %s", message);

//服务器端程序调用send函数,把客户端的地址和端口信息告诉了内核
sendto(socket_fd, send_line, strlen(send_line), 0, (struct sockaddr *) &client_addr, client_len);
  • connect作用是记录客户端目的地址和端口-套接字的关系,之所以可以接收到服务端发送的报文,是因为已经记录了==客户端源地址和端口-套接字=的映射关系。
我们是否可以对一个UDP套接字进行多次connect的操作?
  • 对于TCP,connect只能调用一次,但UDP可以多次connect操作
  • 作用1:可以重新指定新的IP地址和端口号
  • 作用2:可以断开一个已连接的套接字,为了断开,第二次调用connect时,调用方需要把套接字地址结构的地址族成员设置为AF_UNSPEC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值