今天记录一下TCP和socket接口的一些心得:
(一)
关于TCP状态图:
Client端 Server端
Closed LISTEN
SYN-SEND SYN-RECV
ESTABLISHED #两端都进入此状态,此时可以相互传输数据,全双工
FIN-WAIT1 #发送FIN1后
CLOSE-WAIT #收到FIN1,发送ACK1
FIN-WAIT2 #收到ACK1,关闭DATA的接收
LAST-ACK #发送FIN2之后
TIME-WAIT #收到FIN2,发送ACK2
TIMEOUT OR CLOSED #如果在TIME-WAIT状态超时,则CLOSED,或者LAST-ACK状态收到ACK2,也CLOSED
注意,三次握手,四次挥手。easy to say hi, hard to say good bye!
三次握手,SYN->, SYN+ACK<-, ACK->。四次挥手,FIN->,ACK<-,FIN<-,ACK->。
考虑为何要有三次握手,和四次挥手?
其实对TCP/IP有很多攻击的可能方法,因为一个协议是无法保证百分百不被攻破的。
因此,以前我一直以为主要是为了限制防止IP伪装攻击。现在发现,其实多一两次连接,并没有明显的效果。
现在我认为,之所以需要多次握手是因为要解决,网络延时收包晚造成的资源浪费的问题。
(二)
socket接口,linux的与windows的实现不同,即POSIX的socket实现与winsock是不同的。
socket.h不是C标准库里面的,而是系统相关的,所以在linux 下的头文件为<sys/socket.h>.
同时值得注意的是,有一些常用的基本库函数由于与系统、硬件的相关性,C标准库里并没有包含。