主机字节序 数据在内存中保存的顺序,不同的CPU有不同的字节序类型。有小端和大端两种模式:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。
在发送数据前,需要把主机字节序转变为网络字节序。
服务器
调用socket()、bind()、listen()之后,就会监听指定的socket地址了。
客户端
调用socket()、connect()之后,就会向服务器发送了一个连接请求。
服务器通过listen监听到这个connect请求之后,就会调用accept()函数接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。网络I/O操作函数有下面几组:
- read()/write()
- recv()/send()
- readv()/writev()
- recvmsg()/sendmsg()
- recvfrom()/sendto()
完成了读写操作后使用close()函数关闭。
注意:close操作只是使相应socket描述字的引用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。
连接的三次握手过程:
从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。
四次握手释放连接:
1 某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
2 另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
3 一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
4 接收到这个FIN的源发送端TCP对它进行确认。
来源信息:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html