随想录(网络编程中的一些问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

以前,也写过网络编程的一些代码,但是写的不太好。仔细想来,还是对tcp/ip协议理解得不够。加上最近看lwip的实现,学习一下github上开源的代码,再练习一下,也有很多收获。

a)tcp是面向连接的,udp是非连接的。tcp的超时重传和拥塞控制机制,保证了tcp的稳定性。对于广域网这种情况复杂的网络,用tcp比较保险;

b)要实现高性能服务器编程,最好用epoll,socket采用非阻塞的方式,适时用心跳机制检测socket是否健康;

c)socket的read和write都要连续运行,即使失败了,比如出现了EINTR,也要继续读写下去;

d)发送的packet中要显示说明packet的length;

e)状态机和定时器永远是正确的协议处理方法;

f)正确处理多核下的socket表示方法,可以用skynet的方式,也可以用多线程多libevent的方式;

g)tcp最好由客户端关闭,这样服务器不会进入TIMEWAIT状态;

h)局域网测试的结果不代表广域网也ok,所以一定要在不同的场景下试试;

i)tcp的状态切换机制要烂熟于心;

j)wireshark的抓包工具要经常使用;

k)广域网的data必须要加密处理;

l)connect、read、write、close可以全部用异步回调的方式解决;

m)定时器完全可以自己实现;

n)用户侧的checksum可以用复杂一点的算法代替;

o)用户之间没有交互的话,用http代理也可以;

p)udp比较适合局域网;

q)一些实时性的协议比如rtsp,用udp也合适;

r)udp发送packet的时候,length要小一点,否则ip层强制分包,很容易丢包;

s)无效的socket要及时close,否则内存泄漏;

t)高效的socket必然涉及到buffer管理,毕竟很多时候packet是写不完、读不完的;

u)强调时序性的操作,一定要像tcp一样,添加自己的seq和ack;

v)报文传输最好基于json这种格式,不要严格的format形式,否则不好扩展;

w)业务的开发一般是基于某一个通信协议的,私有的也好,标准的也罢,这些都不重要,可以有不同的version;

x)不同的开发语言都有适合自己的framework,但是了解tcpip的基本原理更重要;

y)可以自己实现一个小的tcpip协议栈加深一下印象,看过lwip的同学,肯定不会认为这是一件很恐怖的事情;

z)socket + db基本是server开发的主要模式,可以找一个市场上热门的app,想象一下它们的server端如何设计的,练练手。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 16:58:20

随想录(网络编程中的一些问题)的相关文章

Unix网络编程中的五种I/O模型_转

转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描述符.接受数据缓冲地址.大小传递给内核,但是如果此时 该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空 间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图: 2. 非阻塞I/O模

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

linux网络编程中INADDR_ANY的使用

网络编程中常用到bind函数,需要绑定IP地址,这时可以设置INADDR_ANY INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”.“任意地址”. 也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思. 比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某 个端口,那他要监听哪个网卡地址的端口呢?如果绑定某个具体的ip地址,你只能监听你所设置的ip地

网络编程中的关键问题总结

总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接. accept接受连接的问题在本文最后会聊到,这里谈谈connect的关键点:     使用非阻塞连接建立需要注意:     connect/select返回后,可能没有连接上:需要再次确认是否成功连接: 步骤为: 使用异步connect直接连接一次,因为使用了非阻塞,函数立刻返回: 检查返回值,为0成功连接,否则加入到s

网络编程中的同步与异步

网络编程中有三对关键的词,单线程与多线程.阻塞与非阻塞.同步与异步,同步与异步一直是比较疑惑的地方.以前认为,同步就是阻塞socket,异步就是非阻塞socket,现在发现这样理解很片面的,其实好多地方有同步异步的概念. 数字电路中的同步与异步是针对时钟来说的 同步时序逻辑电路:各触发器有相同的时钟脉冲,时钟脉冲到来时所有触发器状态同时改变异步时序逻辑电路:没有统一的时钟脉冲,所有触发器的状态转换不一定发生在同一时刻,某些触发器的状态转换有可能会延迟. 在通信原理中也有同步与异步的概念 同步传输

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

网络编程中shut_down和close()函数的区别

在Linux C网络编程中,一共有两种方法来关闭一个已经连接好的网络通信,它们就是close函数和shutdown函数,它们的函数原型分别为: 1 #include<unistd.h> 2 int close(int sockfd) 3 //返回:0--成功, 1--失败 4   5 #include<sys/socket.h> 6 int shutdown(int sockfd, int howto) 7 //返回:0--成功, 1--失败 对一个tcp socket调用clos

socket编程之三:socket网络编程中的常用函数

这节本来打算先给出常用函数介绍,再给两个代码实例,写着写着发现越来越长,决定把代码放在下一节. 本节内容持续更新...... 1 socket()函数 原型: int socket(int domain, int type, int protocol); 描述: 类似打开一个文件,返回一个socket描述符,唯一标识一个socket,后面相应的操作都是这用这个socket描述符. 参数: domain:协议族,常用的协议族有AF_INET.AF_INET6.AF_LOCAL.AF_ROUTE等:

关于网络编程中MTU、TCP、UDP、IP

名词解释: MTU(Maxium Transmission Unit)最大传输单元 TCP (Transmission Control Protocal)传输控制协议 UDP (Usage Datagram Protocal)用户数据报协议 IP (Internet Protocal) 因特网协议 TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层(TCP/IP是一个协议簇,并不是代表TCP协议和IP协议) 以太网(Ethemet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传

网络编程中的read,write函数

关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Stevens的<Unix network proggramming,vol1>(Unix网络编程卷1),这两本书公认是Unix网络编程的圣经. 至于第三个层面,UNP的书中有所提及,也有著名的C10K问题,业界也有各种各样的框架和解决方案,本人才疏学浅,在这里就不一一敷述. 本文的重点在于第二个层面,主要