缘起
- 这是《TCPIP网络编程》的Part01的复习版吧,主要框架来自于这本书,我只是列了下自己自己懂了和没懂的地方,算是个复习笔记吧。
- 2023-04-10也算push我自己复习一遍,看看还有哪没有真搞懂的,2023-04-11的时候再check一遍,同时完善一下摘要笔记。
内容
chap1、理解网络编程和套接字
-
TCP client:
socket()、connect()、read()/write()、close() -
TCP server:
socket()、bind()、listen()、accept()、read()/write()、close() -
tcp客户端和服务器区别_深入理解TCP 服务器与客户端,这里有三次握手、四次挥手
-
自己想到的问题:
- 1、client和server怎么区分?TCP中首先发送SYN报文的一方是client,那么UDP中存在发SYN报文嘛,不存在的,lionel
chap2、套接字类型与协议设置
-
int socket(int domain, int type, int protocol);的三个参数详解 -
type至少有以下2种类型
- 流socket:面向连接
- 数据报socket:面向消息
chap3、地址族与数据序列
-
IP+Port
-
字节序
- 大端:高位字节存在高位地址,网络字节序就是大端
- 小端:高位字节存在高位地址
-
字节序转换
- 主机字节序与网络字节序转换
-
lionel,这一节,我并没有完全消化好
chap4-5、基于TCP的服务端/客户端
- 1、基于TCP的代码
- 2、迭代服务器的代码
- 3、echo服务器的代码
chap6、基于UDP的服务端/客户端
-
UDP就是根据端口号将传到主机的数据包交付给最终的UDP套接字
-
sendto()的3个阶段:- 1、向UDP套接字注册目标IP和端口号 使用
connect()只是把这一步给省了【lionel】 - 2、传输数据
- 3、删除UDP套接字中注册的目标地址信息
- 1、向UDP套接字注册目标IP和端口号 使用
-
创建已连接UDP套接字
-
UDP的差异,还需要再了解一下,lionel
- 1、UDP有没有边界
- 2、1个UDP的socket是不是就能和网络上的任何机器连接?
chap7、优雅的断开套接字连接
- 一般定义的断开
close()是指传输数据、接收数据都关闭 shutdown()就只关注其中一个,即,流的一半
chap8、域名及网络地址
- 域名比IP地址更稳定,不用每次修改代码
gethostbyaddr()、 gethostbyname()
chap9、套接字的多种可选项
getsockopt()、setsockopt()- SO_REUSEADDR 【重点是time_wait的状态】,要搜一下TCP-IP状态转换图
- TCP_NODELAY 【理解清楚 Nagle算法】
- lionel,time_wait找了些资料看了下,还是有点蒙的
chap10、多进程服务器端
- 调用
fork() - 信号处理(
wait,waitpid,signal,sigaction) - 分割I/O没完全看懂它
chap11、进程间通信
- 管道
- lionel,未看
chap12、I/O复用
- 原理和
select()
chap13、多种I/O函数
send()、recv()- 带外数据(Out-of-band data) ,翻译得不好,更像叫特殊通道,
MSG_OOB用于创建特殊发送方法和通道以发送紧急消息 readv、writev()- Unix/Linux编程:分散输入和集中输出------readv() 、 writev()
chap14、多播与广播
-
两者都基于UDP,区别在于
-
多播:要加入多播组,哪怕跨网络
-
广播:只能向同一网络中的主机
- 直接广播(Directed):除网络地址外,其余主机地址全部设置为1.
- 本地广播(local):
255.255.255.255
-
- 这个没太懂
最后
参考
- time_wait状态产生的原因,危害,如何避免
- Time-wait状态(2MSL)一些理解
- TIME_WAIT 的原理和实践
- 网络基础知识二(UDP、TCP通信实现过程及函数解析) 【这个比较OK,至少我能理解了,还是一个系列的呢】
- 网络基础知识三(TCP协议三次握手四次挥手、协议格式、可靠传输机制)
收获
-
1、04-10及之前几天有意识的画了些图三次握手、四次挥手,TIME_WAIT,当然粘包的问题后面再去学。
-
2、UDP的
connect()其实不是必须的,我之前还以为需要呢 -
3、复习完这个
- 再看part02
- 再看《编程手册》56-61(这个就很简单了),61章的高级有点深度,其它的,要push自己好好看
- 再看下《Linux高性能服务器编程》的部分章节
- 《unix网络编程》看不看得再说吧
- 主要是push自己,把这部分真正的掌握,要不要学人家画思维导图,还没有想好