好教程推荐系列:TCP面试常见题-张小方的知乎Live-轻松搞定技术面试中常见的网络通信问题(一)

简介: 好教程推荐系列:TCP面试常见题-张小方的知乎Live-轻松搞定技术面试中常见的网络通信问题

先声明一下,文章是我自己整理的笔记,内容是张小方先生的讲稿。欢迎关注张先生主持的【高性能服务器开发】WeChat gongzhong号。


张先生的博客地址是http://blog.csdn.net/analogous_love


张小方 的知乎 Live:轻松搞定技术面试中常见的网络通信问题https://www.zhihu.com/lives/922110858308485120?utm_source=qq&utm_medium=social


本live列举的这些网络问题涵盖了技术面试中关于网络通信的80%的面试题,深入理解并掌握这些原理,不仅能帮您写出高质量的网络通信程序,同时能应付面试中绝大多数网络通信题目,助您的升职加薪一臂之力。



本次 Live 主要包括以下内容 • TCP/IP协议栈层次与三次握手、四次挥手需要知道的细节 • TCP与UDP适用场景 • linux网络模型 • epoll_event结构中epoll_data_t的fd与ptr使用场景 •Windows网络模型 •异步connect •select可以检测网络异常吗 •epoll的水平模式和边缘模式 •阻塞与非阻塞socket的设置与区别 •send/recv返回值问题 •如何编写正确的收与发数据代码 •收发缓冲区如何设计 •SO_SNDTIMEO、SO_RCVTIMEO、TCP_NODELAY、SO_REUSEADDR和SO_REUSEPORT、SO_LINGER选项 •shutdown与优雅关闭 •错误码EINTR •tcp粘包问题 •信号SIGPIPE与EPIPE错误码 •gethostbyname阻塞与错误码 •SO_KEEPALIVE选项与心跳包设计技巧 •如何设计断线重连机制 •如何清除无效的死链 •网络框架中定时器不同实现 •http协议格式、head、get与post方法细节 •http、socks4与socks5代理编码实现 •你问我答互动环节 •总结



技术面试中常见的网络通信细节问题解答


1. TCP/IP协议栈层次结构


2. TCP三次握手需要知道的细节点


3. TCP四次挥手需要知道的细节点(CLOSE_WAIT、TIME_WAIT、MSL)


4. TCP与UDP的区别与适用场景


5. linux常见网络模型详解(select、poll与epoll)


6. epoll_event结构中的epoll_data_t的fd与ptr的使用场景


7. Windows常见的网络模型详解(select、WSAEventSelect、WSAAsyncSelect)


8. Windows上的完成端口模型(IOCP)


9. 异步的connect函数如何编写


10.select函数可以检测网络异常吗?


11.你问我答环节一


12. epoll的水平模式和边缘模式


13. 如何将socket设置成非阻塞的(创建时设置与创建完成后设置),非阻塞socket与阻塞的socket在收发数据上的区别


14. send/recv(read/write)返回值大于0、等于0、小于0的区别


15.如何编写正确的收数据代码与发数据代码


16.发送数据缓冲区与接收数据缓冲区如何设计


17.socket选项SO_SNDTIMEO和SO_RCVTIMEO


18.socket选项TCP_NODELAY


19.socket选项SO_REUSEADDR和SO_REUSEPORT(Windows平台与linux平台的区别)


20.socket选项SO_LINGER


21.shutdown与优雅关闭


22.你问我答环节二


23.socket选项SO_KEEPALIVE


24.关于错误码EINTR


25.如何解决tcp粘包问题


26.信号SIGPIPE与EPIPE错误码


27.gethostbyname阻塞与错误码获取问题


28.心跳包的设计技巧(保活心跳包与业务心跳包)


29.断线重连机制如何设计


30.如何检测对端已经关闭


31.如何清除无效的死链(端与端之间的线路故障)


32.定时器的不同实现及优缺点


33.你问我答环节三


34.http协议的具体格式


35.http head、get与post方法的细节


36.http代理、socks4代理与socks5代理如何编码实现


37.ping


38.telnet


39.你问我答环节四


40.总结



--------------------------------------------------------------------------------------




技术面试中常见的网络通信细节问题解答


1. TCP/IP协议栈层次结构

image.png


2. TCP三次握手需要知道的细节点


答:1、三次握手,如果前两次有某一次失败,会重新从第一次开始,重来三次。


2、三次握手,如果最后一次失败,服务器并不会重传ack报文,而是直接发送RTS报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。详情参见http://blog.csdn.net/libaineu2004/article/details/79020031


3、发起连接时如果发生TCP SYN丢包,那么系统默认的重试间隔是3s,这期间不会返回错误码。


4、如何模拟tcp挥手失败?答案是iptables命令可以过滤数据包,丢弃所有的连接请求,致使客户端无法得到任何ack报文。


TCP 的那些事儿(上)

TCP 的那些事儿(下)



3. TCP四次挥手需要知道的细节点(CLOSE_WAIT、TIME_WAIT、MSL)


答:http://blog.csdn.net/libaineu2004/article/details/78886213 再谈应用环境下的TIME_WAIT和CLOSE_WAIT


http://blog.csdn.net/libaineu2004/article/details/78886182 CLOSE_WAIT状态的原因与解决方法


http://blog.csdn.net/libaineu2004/article/details/78803068 TCP面试常见题:time_wait状态产生的原因,危害,如何避免



4. TCP与UDP的区别与适用场景


答:TCP协议栈本身是可靠,不会丢包,不会乱序,失败会重发。UDP需要应用层做协议来保证可靠性。视频可以用UDP。


必须使用udp的场景:广播。



5. linux常见网络模型详解(select、poll与epoll)


答:select和poll本质上没有区别,都是轮询,但是poll没有最大设备描述符数量的限制。



6. epoll_event结构中的epoll_data_t的fd与ptr的使用场景


答:在epoll模型中使用了一个struct epoll_event的结构体:


typedef union epoll_data 
{ void *ptr;
 int fd; 
 uint32_t u32;
 uint64_t u64;
 } epoll_data_t; 
struct epoll_event 
{ uint32_t events; /* Epoll events */ 
 epoll_data_t data; /* User data variable */
 };



7. Windows常见的网络模型详解(select、WSAEventSelect、WSAAsyncSelect)


8. Windows上的完成端口模型(IOCP)


9. 异步的connect函数如何编写


参考博客:http://blog.csdn.net/analogous_love/article/details/60761528

image.png

//关于tcp连接的异步connect实现流程如下:  
//(1)设置socket连接为非阻塞.  
//(2)调用connect函数.返回0表明连接成功.如果返回-1,同时errno为EINPROGRESS表明正在建立连接.  
//(3)使用select , epoll等 , 当描述符可写的时候检查连接状态.  
#include <stdio.h>  
#include <fcntl.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <errno.h>  
#include <sys/epoll.h>  
#include <netinet/in.h>  
#include <string.h>  
void setnonblock(int fd)  
{  
    int flags = fcntl(fd, F_GETFL);  
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);  
}  
int main(){  
    const char* ip = "127.0.0.1";  
    short port = 9999;  
    //设置连接地址  
    struct sockaddr_in addr;  
    socklen_t socklen = sizeof(struct sockaddr_in);  
    memset(&addr , 0 , sizeof(struct sockaddr_in));  
    addr.sin_family = AF_INET;  
    addr.sin_addr.s_addr = inet_addr(ip);  
    addr.sin_port = htons(port);  
    //创建描述符  
    int fd = socket( AF_INET , SOCK_STREAM , 0);  
    if (fd < 0){  
        printf("socket() error\n");  
        return -1;  
    }  
    //设置描述符为非阻塞  
    setnonblock(fd);  
    //连接  
    int res;  
    res = connect(fd , (struct sockaddr*)&addr , socklen);  
    if (res == 0){  
        printf("connect ok(1)\n");  
    } else if (res == -1 && errno != EINPROGRESS){  
        printf("connect err(1)\n");  
        close(fd);  
        return -1;  
    } else {  
        int epfd;  
        //创建epoll描述符  
        epfd = epoll_create(1024);  
        if ( (epfd = epoll_create(1024) ) == -1){  
            printf("epoll_create() err\n");  
            close(fd);  
            return -1;  
        }  
        //添加关注事件  
        struct epoll_event ev;  
        ev.events = EPOLLOUT;  
        ev.data.fd = fd;  
        epoll_ctl( epfd , EPOLL_CTL_ADD , fd , &ev);  
        //编写网络程序的时候,epoll是程序的主循环.我们这里为了测试,连接上或connect超时(75秒)就break掉.  
        //正常的流程是写一个处理connect结果的回调函数.  
        int event_max = 1;  
        struct epoll_event events[event_max];  
        int i;  
        while (1){  
            res = epoll_wait( epfd , events , event_max , -1);  
            if (res > 0){  
                for ( i = 0 ; i < res ; i++){  
                    if ( events[i].data.fd == fd && ( events[i].events & EPOLLOUT) ){ //29(EPOLLOUT|EPOLLERR|EPOLLHUP)  //4(EPOLLOUT)  
                        //检查是否连接成功  
                        int optval;  
                        socklen_t optlen = sizeof(optval);  
                        int res1 = getsockopt(fd, SOL_SOCKET, SO_ERROR, &optval, &optlen);  
                        if ( res1 < 0 || optval){  
                            close(fd);  
                            close(epfd);  
                            printf("connect err(2)\n");  
                            return -1;  
                        } else {  
                            printf("connect ok(2)\n");  
                        }  
                    }  
                }  
                break;  
            }  
        }  
        close(fd);  
        close(epfd);  
    }  
}  

 


相关文章
|
2天前
|
存储 安全 物联网
网络安全与信息安全:防御前线的技术与意识
【5月更文挑战第9天】 在数字化时代,网络安全和信息安全已成为维护个人隐私、企业数据和国家安全的基石。本文将深入探讨网络安全漏洞的概念、加密技术的重要性以及提升安全意识的必要性。通过对这些关键领域的分析,我们将了解如何构建一个更加坚固的信息安全防线,并掌握保护信息不受未授权访问、泄露或破坏的策略和技术。
|
4天前
|
负载均衡 网络协议
虚拟网络技术:bond技术
虚拟网络技术:bond技术
8 0
|
5天前
|
运维 安全 网络协议
即时通讯安全篇(十四):网络端口的安全防护技术实践
网络端口因其数量庞大、端口开放和关闭的影响评估难度大,业务影响程度高、以及异常识别技术复杂度高等特点给网络端口安全防护带来了一定的挑战,如何对端口风险进行有效治理几乎是每个企业安全团队在攻击面管理工作中持续探索的重点项。
17 0
|
5天前
|
安全 物联网 网络安全
网络安全与信息安全:防御前线的关键技术与策略
【5月更文挑战第6天】在数字化时代,网络安全与信息安全已成为保护个人隐私、企业资产和国家安全不可或缺的一环。本文深入探讨了网络安全漏洞的概念、加密技术的进展以及提升安全意识的重要性。通过分析当前网络环境中存在的风险和挑战,文章提出了一系列创新的防御措施和最佳实践,旨在帮助读者构建一个更加安全的网络环境。
|
7天前
|
SQL 安全 算法
网络安全与信息安全:防御前线的技术与意识
【5月更文挑战第4天】在数字化时代,网络安全和信息安全已成为维护网络环境稳定的关键。本文深入探讨了网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性,旨在为读者提供全面的安全防护策略。通过对常见安全威胁的分析,我们展示了如何运用现代加密技术和安全机制来保护数据和隐私。同时,文章强调了培养个人和组织的安全意识对于构建安全防线的核心作用。
17 0
|
8天前
|
存储 安全 网络安全
网络安全与信息安全:防御前线的技术与意识
【5月更文挑战第3天】 在数字化时代,网络安全和信息安全已成为维护社会稳定、保护个人隐私和企业资产的重要领域。本文深入探讨了网络安全漏洞的成因与影响,加密技术的最新发展以及提升安全意识的必要性。通过对现有威胁的分析,我们强调了构建多层次防御策略的重要性,并提出了相应的技术解决方案和管理措施。
|
9天前
|
存储 SQL 安全
网络安全与信息安全:防御前线的关键技术与策略
【5月更文挑战第2天】 在数字化时代,数据成为了新的货币,而网络安全则是保护这些宝贵资产不受威胁的盾牌。本文将深入探讨网络安全漏洞的本质,分析加密技术如何成为防御体系的核心,并强调提升个人和企业的安全意识在构建坚固防线中的重要性。通过技术性解析和实践策略的分享,旨在为读者提供一套综合性的网络与信息安全解决方案。
|
10天前
|
安全 网络安全
网络安全攻防实战演练:技术探索与实践
【5月更文挑战第1天】网络安全攻防实战演练,通过模拟攻击与防御,提升组织应对网络安全威胁的能力。演练包括准备、攻击、防御和总结四个阶段,涉及环境搭建、攻击技术应用、防御措施执行及后期评估。此类演练有助于检验安全防护能力,提升应急响应速度,暴露系统隐患,加强团队协作,是保障网络安全的关键实践。
|
11天前
|
机器学习/深度学习 自动驾驶 安全
基于深度学习的图像识别技术在自动驾驶系统中的应用网络安全与信息安全:防御前线的关键技术与意识
【4月更文挑战第30天】随着人工智能技术的飞速发展,深度学习已成为推动多个技术领域革新的核心力量。特别是在图像识别领域,深度学习模型已展现出超越传统算法的性能。在自动驾驶系统中,准确的图像识别是确保行车安全和高效导航的基础。本文将探讨深度学习在自动驾驶中图像识别的应用,分析关键技术挑战,并提出未来的发展方向。
|
11天前
|
存储 安全 网络安全
网络安全与信息安全:防御前线的技术与意识
【4月更文挑战第30天】在数字化时代,数据成为了新的货币,而网络安全则是保护这些资产的保险箱。本文深入探讨了网络安全漏洞的成因、加密技术的进展以及提升安全意识的重要性,旨在为读者提供一道防线,帮助他们在网络空间中更安全地存储、传输和处理信息。通过分析当前的威胁景观,我们讨论了如何通过技术手段和行为改变来增强个人和组织的网络防护能力。