TCP字节流与UDP数据报的区别
参考链接 http://www.linuxidc.com/Linux/2014-11/109545.htm
TCP/IP协议栈分为四层
链路层
也称作数据链路层或网络接口层,通常包括网络接口卡与设备驱动,链路层是物理链接领域标准化结果。若两台计算机通过网络进行数据交换,链路层就负责整个物理连接。
网络层
也称作互联层,负责在复杂的网络中传输数据时的路径的选择,并提供数据报服务,由于IP本身是面向消息的、不可靠的协议。虽然每次传输数据时会帮我们选择路径,但是并不一致,传输过程中一旦出现路径错误,则选择其他路径。如果发生数据丢失或错误则无法解决,IP协议无法应对数据错误。
传输层
包括TCP与UDP,网络层负责点到点的传输(主机或路由器之间的传输),而传输层负责端到端的传输(主机中进程之间的传输)。其中,TCP协议可以保证传输数据的可靠性。
IP层只关注一个数据包的传输过程。因此,即使传输多个数据包,每个数据包也是由IP层实际传输的。也就是说,传输的顺序及传输本身不可靠的。若只利用IP层传输数据,则有可能导致后传输的数据包比先传输的数据包先到达目的地。也有可能在传输的过程中丢失或损毁,反之如果添加TCP协议(传输控制协议)的话就不会出现这种情况。
参考连接 http://java-mzd.iteye.com/blog/1007577
总之,TCP和UDP存在于IP层之上,决定主机之间的数据传输方式,TCP确认之后向不可靠的IP协议赋予可靠性。
应用层
套接字通信过程是自动处理的。选择数据传输路径、数据确认过程都被隐藏到套接字内部。总之,向各位提供的工具就是套接字,大家只需利用套接字编写程序即可。编写软件的过程中,需要根据程序特点决定服务端和客户端之间的数据传输规则,这便是应用层的协议。
OSI参考模型与TCP/IP参考模型对比
TCP服务器端函数调用顺序
Socket -> bind -> listen -> accept -> read/write -> close
服务器端的等待连接请求状态:
在服务器端调用了bind函数为套接字分配了IP地址和端口号后,应该调用函数listen进入等待连接请求状态,只有服务器端调用了listen函数客户端调用connect函数时才能连接上服务器端。
客户端在请求连接时,在连接被受理前一直处于等待状态,客户端的连接请求将被放到连接请求等待队列(连接未完成的缓冲队列,其内是未决连接),listen的第二个参数决定了等待队列的大小(当连接的数量大于队列大小时,未进入队列的连接会自动重连直到57秒后),当服务器端准备好服务器端套接字和连接请求等待队列后(即调用listen后)的可接收连接请求的状态被称为等待连接请求状态。
参考连接:http://blog.chinaunix.net/uid-17102734-id-2830185.html
http://blog.csdn.net/wm_1991/article/details/52176287
http://blog.sina.com.cn/s/blog_92786dfd0101nq5e.html
http://blog.csdn.net/ordeder/article/details/21551567
服务器端受理客户端的连接请求:
受理连接请求意味着进入可接收数据状态:accept函数从listen的等待队中取出一个,接收数据的套接字由函数accept内部自动创建并返回其文件描述符,被accept函数创建的套接字自动与发起连接请求的客户端建立连接,使用新建立的套接字与客户端进行数据交换, 如果等待队列中无等待的连接,那么accept可能会进入阻塞状态(视套接字类型而定)直到有客户端请求连接
int accept(int sockfd, struct sockaddr* addr, socklen_t* len) //成功时返回创建的套接字的文件描述符,失败返回-1
//参数sockfd为服务器端创建的用于listen与bind的监听套接字 参数addr指向存储客户端地址信息的变量的指针 参数len描述第二个参数addr结构体的长度,需传递含有具体结构体长度的变量的地址
参考链接:http://ticktick.blog.51cto.com/823160/779866
http://blog.csdn.net/david_xtd/article/details/7087843
TCP客户端函数调用顺序:
Socket -> connect -> read/write -> close
服务器端是调用listen函数后等待连接,客户端是调用函数connect请求连接
int connect (int sockfd, struct sockaddr * serv_addr, socklen_taddrlen); //成功时返回0 失败时返回-1
//参数sockfd 客户端套接字文件描述符 参数serv_addr指向存有服务器地址信息的变量的指针 参数addrlen描述第二个参数serv_addr结构体的长度
该函数在服务器端接收连接请求或者发生异常中断连接请求时返回(注意:接收连接请求不是服务器调用accept函数,而是服务器端将连接请求加入到等待队列,因此函数返回后不一定能进行数据交换)
其实客户端的套接字也被分配了服务器端的IP地址与端口,这一分配的过程发生在调用connect函数时,由操作系统内核完成