Linux网络编程

Linux网络编程入门 
http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html

Linux网络编程一步一步学+基础
http://blog.chinaunix.net/u1/34426/showart_419300.html
http://blog.chinaunix.net/u1/48325/showart.php?id=413838

服务器端程序编写:
(1) 调用ServerSocket(int port)创建一个服务器套接字,并绑定到指定端口上。
(2) 调用accept(),监听连接请求,则接受连接,返回通信套接字。
(3) 调用Socket类的getOutStream() 和 getInputStream 获取输出流和输入流,开始网络数据的发送和接受。(用到的函数是send(),recv())
(4)关闭通信套接字:Socket.close().
说明:编写服务器程序时,先调用socket()创建一个套接字,调用bind()绑定IP地址和端口,并进行监听listen(),然后启动一个死循环,循环中调用accept()接受连接。对于每个接受的连接,可以启动多线程方式进行处理,在线程中调用send(), recv()发送和接受数据。


客户端程序编写:
(1) 调用Socket() 创建一个流套接字,并连接服务器。(函数是connect())
(2)调用Socket类的getOutputStream()和fetInputStream获取输出流和输入流,开始网络数据的发送和接受,(用到的函数是send(),recv())
(3)关闭通信套接字Socket.close()。


OSI标准七层中最重要的是传输层,它把实际使用的通信子网与高层应用分开,提供发送端 和接收端之间的可靠低成本的数据传输。TCP和UDP协议属于这一层。
网络层:主要对主机和网络之间的交互进行定义,它又被成为通信子网层,定义了在网络中传输的基本数据单元以及目的寻址和选路的概念,IP协议输入这一层。
OSI标准:应用层(Application)—表示层(Presentation)—会话层(Session)—传输层(Transport)—网络层(Network)—数据链路层(Data Link)—物理层(Physical)

TCP/IP协议是一组在网络中提供可靠数据传输和无连接数据服务的协议。其中提供可靠数据传输的协议称为传输控制协议TCP,而提供无连接服务的协议叫做网际协议IP。TCP/IP协议是一个包含很多其他协议的一个网络协议集合。
TCP/IP协议的网络提供的主要服务有:电子邮件,文件传输,远程登录,网络文件系统,电视会议系统以及万维网等
TCP/IP协议的体系结构是:应用层—传输层(TCP、UDP、ICMP)—网络层(IP协议)—网络接口层

TCP建立连接时使用“三次握手协议TWH”方式:
(1) 客户端先用connect()向服务器发出一个要求连接的信号SYN1。
(2) 服务器进程接收到这个信号后,发回应答信号ack1,同时也这也是一个要求回答的信号SYN2。
(3) 客户端收到信号ack1和SYN2后,再次应答ack2。
(4) 服务器受到应答信号ack2,一次连接才算建立完成。

一、TCP握手协议 

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
 完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念: 
未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目
所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。 
Backlog参数:表示未连接队列的最大容纳数目。
 SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,
系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。 

二、TCP断开连接

采用四次握手断开一个连接

断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类的函数开始主动终止一个连接。 第一次握手:当调用close函数断开一个连接时,主动断开的一方发送FIN(finish报文)给对方。有了之前的经验,我想你应该明白我说的FIN报文时什么东西。

也就是一个设置了FIN标志位的报文段。FIN报文也可能附加用户数据,如果这一方还有数据要发送时,将数据附加到这个FIN报文时完全正常的。

之后你会看到,这种附加报文还会有很多,例如ACK报文。 第二次握手:当被动关闭的一方收到FIN报文时,它会发送ACK确认报文(对于ACK这个东西你应该很熟悉了)。这里有个东西要注意,因为TCP是双工的,也就是说,你可以想象一对TCP连接上

有两条数据通路。当发送FIN报文时,意思是说,发送FIN的一端就不能发送数据,也就是关闭了其中一条数据通路。被动关闭的一端发送了ACK后,应用层通常就会检测到这个连接即将断开,

然后被动断开的应用层调用close关闭连接。 第三次握手:被关闭端一旦当调用close(or closesocket),这一端就会发送FIN报文。也就是说,现在被动关闭的一端也发送FIN给主动关闭端。

有时候,被动关闭端会将ACK和FIN两个报文合在一起发送。 第四次握手:主动关闭端收到FIN后也发送ACK,然后整个连接关闭(事实上还没完全关闭,只是关闭需要交换的报文发送完毕),四次握手完成。

如你所见,因为被动关闭端可能会将ACK和FIN合到一起发送,所以这也算不上

二、TCP断开连接

采用四次握手断开一个连接

断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类的函数开始主动终止一个连接。 第一次握手:当调用close函数断开一个连接时,主动断开的一方发送FIN(finish报文)给对方。有了之前的经验,我想你应该明白我说的FIN报文时什么东西。

也就是一个设置了FIN标志位的报文段。FIN报文也可能附加用户数据,如果这一方还有数据要发送时,将数据附加到这个FIN报文时完全正常的。

之后你会看到,这种附加报文还会有很多,例如ACK报文。 第二次握手:当被动关闭的一方收到FIN报文时,它会发送ACK确认报文(对于ACK这个东西你应该很熟悉了)。这里有个东西要注意,因为TCP是双工的,也就是说,你可以想象一对TCP连接上

有两条数据通路。当发送FIN报文时,意思是说,发送FIN的一端就不能发送数据,也就是关闭了其中一条数据通路。被动关闭的一端发送了ACK后,应用层通常就会检测到这个连接即将断开,

然后被动断开的应用层调用close关闭连接。 第三次握手:被关闭端一旦当调用close(or closesocket),这一端就会发送FIN报文。也就是说,现在被动关闭的一端也发送FIN给主动关闭端。

有时候,被动关闭端会将ACK和FIN两个报文合在一起发送。 第四次握手:主动关闭端收到FIN后也发送ACK,然后整个连接关闭(事实上还没完全关闭,只是关闭需要交换的报文发送完毕),四次握手完成。

如你所见,因为被动关闭端可能会将ACK和FIN合到一起发送,所以这也算不上

二、TCP断开连接

采用四次握手断开一个连接

断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类的函数开始主动终止一个连接。 第一次握手:当调用close函数断开一个连接时,主动断开的一方发送FIN(finish报文)给对方。有了之前的经验,我想你应该明白我说的FIN报文时什么东西。

也就是一个设置了FIN标志位的报文段。FIN报文也可能附加用户数据,如果这一方还有数据要发送时,将数据附加到这个FIN报文时完全正常的。

之后你会看到,这种附加报文还会有很多,例如ACK报文。 第二次握手:当被动关闭的一方收到FIN报文时,它会发送ACK确认报文(对于ACK这个东西你应该很熟悉了)。这里有个东西要注意,因为TCP是双工的,也就是说,你可以想象一对TCP连接上

有两条数据通路。当发送FIN报文时,意思是说,发送FIN的一端就不能发送数据,也就是关闭了其中一条数据通路。被动关闭的一端发送了ACK后,应用层通常就会检测到这个连接即将断开,

然后被动断开的应用层调用close关闭连接。 第三次握手:被关闭端一旦当调用close(or closesocket),这一端就会发送FIN报文。也就是说,现在被动关闭的一端也发送FIN给主动关闭端。

有时候,被动关闭端会将ACK和FIN两个报文合在一起发送。 第四次握手:主动关闭端收到FIN后也发送ACK,然后整个连接关闭(事实上还没完全关闭,只是关闭需要交换的报文发送完毕),四次握手完成。

如你所见,因为被动关闭端可能会将ACK和FIN合到一起发送,所以这也算不上


Linux网络编程_第1张图片



11-5-31
    socket函数read write send和recv
     http://hi.baidu.com/socai/blog/item/49128a2c780c98e58b1399fb.html


11-5-31
11-5-31
Linux下getsockopt/setsockopt 函数说明
http://blog.csdn.net/xioahw/archive/2009/04/08/4056514.aspx

http://hi.baidu.com/kroodylove/blog/item/864d918bc7d99a14c9fc7a48.html

       
11-5-31
   socket函数read write send和recv
    http://hi.baidu.com/socai/blog/item/49128a2c780c98e58b1399fb.html

11-5-31
  Linux下getsockopt/setsockopt 函数说明
   http://blog.csdn.net/xioahw/archive/2009/04/08/4056514.aspx

   http://hi.baidu.com/kroodylove/blog/item/864d918bc7d99a14c9fc7a48.html

11-5-31

11-5-31
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET使用说明 
  http://blog.csdn.net/zjl_1026_2001/archive/2008/03/06/2153222.aspx

linux—select详解
http://blog.csdn.net/boboiask/archive/2009/04/07/4055655.aspx
linux中select()函数分析
http://blog.csdn.net/zi_jin/archive/2009/05/25/4214359.aspx



11-5-31

UNIX SOCKET编程简介

http://www.cnitblog.com/tarius.wu/articles/434.html

套接字学习教程之一
http://blog.csdn.net/zjl_1026_2001/archive/2008/03/07/2155743.aspx
11-5-31
11-5-31
    使用socket的Linux上的C语言helloworld多线程服务器和客户端测试程序
     http://blog.csdn.net/dlutcat/archive/2007/10/07/1813933.aspx 

11-5-31
    非阻塞connect 

    http://memorymyann.javaeye.com/blog/654903 


11-5-31

socket编程原理
http://bbs.chinaunix.net/viewthread.php?tid=198859
socket编程原理
http://www.chinaunix.net/jh/4/198859.html 


11-5-31
Linux Epoll介绍和程序实例
http://blog.csdn.net/sparkliang/archive/2009/11/05/4770655.aspx

Epoll vs. IOCP
http://blog.csdn.net/sparkliang/archive/2009/11/19/4836536.aspx

linux epoll技术介绍
http://hi.baidu.com/soft530/blog/item/4104f5fc326a6deefc037fab.html

epoll学习笔记
http://www.cppblog.com/converse/archive/2008/04/29/48482.html

epoll 基本介绍
http://hi.baidu.com/roxws/blog/item/be8cfa4e603a1ccfd1c86ad5.html


11-5-31
tcp和udp多线程的epoll服务器+客户端源代码 
http://app.cnzer.cn/html-88214-1.html

epoll 多线程 服务器
http://www.cnblogs.com/nanshouyong326/archive/2010/12/21/1912894.html

多线程epoll
http://hi.baidu.com/roxws/blog/item/98b3f9fabccd2f1ba8d311b6.html



11-5-31
socket函数read write send和recv
http://hi.baidu.com/socai/blog/item/49128a2c780c98e58b1399fb.html

11-5-31
Linux下getsockopt/setsockopt 函数说明
http://blog.csdn.net/xioahw/archive/2009/04/08/4056514.aspx

http://hi.baidu.com/kroodylove/blog/item/864d918bc7d99a14c9fc7a48.html

11-5-31
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET使用说明 
  http://blog.csdn.net/zjl_1026_2001/archive/2008/03/06/2153222.aspx

linux—select详解
http://blog.csdn.net/boboiask/archive/2009/04/07/4055655.aspx
linux中select()函数分析
http://blog.csdn.net/zi_jin/archive/2009/05/25/4214359.aspx

11-5-31

UNIX SOCKET编程简介

http://www.cnitblog.com/tarius.wu/articles/434.html

套接字学习教程之一
http://blog.csdn.net/zjl_1026_2001/archive/2008/03/07/2155743.aspx

11-5-31
使用socket的Linux上的C语言helloworld多线程服务器和客户端测试程序
http://blog.csdn.net/dlutcat/archive/2007/10/07/1813933.aspx 

socket编程原理
http://bbs.chinaunix.net/viewthread.php?tid=198859
socket编程原理
http://www.chinaunix.net/jh/4/198859.html 


11-5-31
Linux Epoll介绍和程序实例
http://blog.csdn.net/sparkliang/archive/2009/11/05/4770655.aspx

Epoll vs. IOCP
http://blog.csdn.net/sparkliang/archive/2009/11/19/4836536.aspx

linux epoll技术介绍
http://hi.baidu.com/soft530/blog/item/4104f5fc326a6deefc037fab.html

epoll学习笔记
http://www.cppblog.com/converse/archive/2008/04/29/48482.html

epoll 基本介绍
http://hi.baidu.com/roxws/blog/item/be8cfa4e603a1ccfd1c86ad5.html


11-5-31
tcp和udp多线程的epoll服务器+客户端源代码 
http://app.cnzer.cn/html-88214-1.html

epoll 多线程 服务器
http://www.cnblogs.com/nanshouyong326/archive/2010/12/21/1912894.html

多线程epoll
http://hi.baidu.com/roxws/blog/item/98b3f9fabccd2f1ba8d311b6.html
11-5-31
socket函数read write send和recv
http://hi.baidu.com/socai/blog/item/49128a2c780c98e58b1399fb.html

11-5-31
Linux下getsockopt/setsockopt 函数说明
http://blog.csdn.net/xioahw/archive/2009/04/08/4056514.aspx

http://hi.baidu.com/kroodylove/blog/item/864d918bc7d99a14c9fc7a48.html

11-5-31
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET使用说明 
  http://blog.csdn.net/zjl_1026_2001/archive/2008/03/06/2153222.aspx

linux—select详解
http://blog.csdn.net/boboiask/archive/2009/04/07/4055655.aspx
linux中select()函数分析
http://blog.csdn.net/zi_jin/archive/2009/05/25/4214359.aspx

11-5-31

UNIX SOCKET编程简介

http://www.cnitblog.com/tarius.wu/articles/434.html

套接字学习教程之一
http://blog.csdn.net/zjl_1026_2001/archive/2008/03/07/2155743.aspx

11-5-31
使用socket的Linux上的C语言helloworld多线程服务器和客户端测试程序
http://blog.csdn.net/dlutcat/archive/2007/10/07/1813933.aspx 

socket编程原理
http://bbs.chinaunix.net/viewthread.php?tid=198859
socket编程原理
http://www.chinaunix.net/jh/4/198859.html 


11-5-31
Linux Epoll介绍和程序实例
http://blog.csdn.net/sparkliang/archive/2009/11/05/4770655.aspx

Epoll vs. IOCP
http://blog.csdn.net/sparkliang/archive/2009/11/19/4836536.aspx

linux epoll技术介绍
http://hi.baidu.com/soft530/blog/item/4104f5fc326a6deefc037fab.html

epoll学习笔记
http://www.cppblog.com/converse/archive/2008/04/29/48482.html

epoll 基本介绍
http://hi.baidu.com/roxws/blog/item/be8cfa4e603a1ccfd1c86ad5.html


11-5-31
tcp和udp多线程的epoll服务器+客户端源代码 
http://app.cnzer.cn/html-88214-1.html

epoll 多线程 服务器
http://www.cnblogs.com/nanshouyong326/archive/2010/12/21/1912894.html

多线程epoll
http://hi.baidu.com/roxws/blog/item/98b3f9fabccd2f1ba8d311b6.html
11-5-31
11-5-31
socket函数read write send和recv
http://hi.baidu.com/socai/blog/item/49128a2c780c98e58b1399fb.html
11-5-31
Linux下getsockopt/setsockopt 函数说明
http://blog.csdn.net/xioahw/archive/2009/04/08/4056514.aspx

http://hi.baidu.com/kroodylove/blog/item/864d918bc7d99a14c9fc7a48.html
11-5-31
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET使用说明 
  http://blog.csdn.net/zjl_1026_2001/archive/2008/03/06/2153222.aspx

linux—select详解
http://blog.csdn.net/boboiask/archive/2009/04/07/4055655.aspx
linux中select()函数分析
http://blog.csdn.net/zi_jin/archive/2009/05/25/4214359.aspx
11-5-31

UNIX SOCKET编程简介

http://www.cnitblog.com/tarius.wu/articles/434.html

套接字学习教程之一
http://blog.csdn.net/zjl_1026_2001/archive/2008/03/07/2155743.aspx
11-5-31
使用socket的Linux上的C语言helloworld多线程服务器和客户端测试程序
http://blog.csdn.net/dlutcat/archive/2007/10/07/1813933.aspx 

你可能感兴趣的:(Linux网络编程)