SlideShare a Scribd company logo
9. TCP는 Reliable Protocol이지만
Infallible Protocol은 아니라는 것을 알아야 한다.
TCP가 실패하는 상황들
김태우
내용, 그림 출처
Effective TCP/IP Programming
By Jon C. Snader
TCP는 마법이 아니다.
TCP가 모든 경우에 대해 데이터 전송을 보장하는 것은 아니다.
상대가 연결을 종료하면 TCP도 어쩔 수 없다.
TCP가 “진짜” 보장하는 것
TCP는 end-to-end 프로토콜이다.
연결이 지속된다고 가정할 때,
End와 end간에
모든 데이터가 손상되지 않은 상태로 순서
대로 도착하는 것을 보증한다.
하지만!
여기서의 end는 TCP 계층.
A와 B간의 전송은 보장하지 않는다.
TCP가 실패하는 경우
1. Network Outage(기능 상실)
2. Peer Application Crash
3. Peer Host Crash
1.Network Outage
1. End point에서 먼 곳의 문제
 라우터가 다른 경로를 찾음
2. 중간 라우터의 문제
 ICMP 메시지가 에러를 전송.
3. End point(수신측의 TCP계층)에서 문제가 생긴 경우
 TCP가 포기하거나 오류가 보고될 때까지 계속 요청하게됨.
2. Peer Application Crash
1. Peer Application이 Crash되면 우리에게 FIN을 보낸다.
2. 이 경우 Peer에서 실제로 문제가 발생한 경우와 Peer가 close
를 호출한 경우를 구분할수 없다.
3. FIN이 close를 의미할수도 있으니 우리측은 남은 메시지를 전
송하게 됨.
4. 상대측은 연결이 존재하지 않으므로 RST로 응답한다.
Client Server
1. FIN
2. Left data
3. RST
※ Application이 FIN을 받는 타이밍
클라이언트 서버
1. 서버가 응답을 전송한 뒤 꺼진 상황
• 클라이언트의 애플리케이션의 send가 데이터를 커널 버퍼에 복사하고 리턴
• 클라이언트의 TCP가 데이터를 전송
• 서버의 TCP가 ACK전송
• 서버의 애플리케이션이 커널 버퍼로 부터 readline으로 입력을 받아옴
• 서버의 애플리케이션이 send로 커널 버퍼에 에코 메시지 복사후 리턴
• 서버의 TCP가 클라이언트 TCP에게 데이터 전송 한뒤
• 서버 애플리케이션이 죽으면서 서버의 TCP가 FIN을 보냄
• 클라이언트의 애플리케이션은 readline을 한뒤에 FIN이 와서 fgets로 넘어갔고,
• 클라이언트의 TCP는 FIN에 대한 ACK는 보냈으나 여전히 close명령을 받지 않았으므로
FIN은 보내지 않는다.
• 이때 클라이언트의 애플리케이션은 사용자 입력을 받고 있으므로 FIN이 왔다는 것을 알수
없어 close를 하지 않는다.
• 클라이언트의 애플리케이션은 사용자 입력을 받은 후 send를 하고
• 클라이언트의 TCP는 이를 받아서 전송한다.
• 서버의 TCP는 이 데이터를 받고는 커넥션이 끝났다는 것을 알리려 RST를 보내고
• 클라이언트는 이 데이터를 readline을 통해 알게 되어 close를 하게 된다.
2. 서버가 응답을 전송하기 전에 꺼진 상황
• 클라이언트의 애플리케이션의 send가 데이터를 커널 버퍼에 복사하고 리턴
• 클라이언트의 TCP가 데이터를 전송
• 서버의 TCP가 ACK전송
• 서버 애플리케이션이 죽으면서 서버의 TCP가 FIN을 보냄
• 클라이언트의 애플리케이션은 이 데이터를 readline을 통해 알게되어 close를
하게 된다.
언제 문제가 되나?
• 읽기 없이 여러번 쓰기를 하는 Application에서 흔하게 발생
• 문제 발생 후 한번 더 전송한 이후에 애플리케이션이 상대의 문
제를 알게되는 것이 문제.
3. Peer Host Crash
1. Peer의 TCP가 FIN을 통해 재난을 알릴수 없다.
2. Peer 호스트가 재부팅 될 때까지 네트워크 장애로 인식.
3. TCP는 세그먼트들을 계속 재전송한다.
4. 끝까지 재부팅을 하지 않으면, 우리측 애플리케이션이
TIMEOUT 오류를 반환한다.
5. 그전에 재부팅이 될때는 우리측의 세그먼트가 서버측에 도달
하면 TCP는 RST를 반환한다.
Client Sever
1. TIMEOUT 전까지 재전송
2. 재부팅 -> RST 전송
결론
• TCP에도 다양한 실패상황들이 존재한다.
• TCP의 한계를 알고 대비해야한다.

More Related Content

What's hot

혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버
iFunFactory Inc.
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
Nam Hyeonuk
 
황규영 포트폴리오
황규영 포트폴리오황규영 포트폴리오
황규영 포트폴리오
Q_0
 
소프트웨어 엔지니어의 한국/미국 직장생활
소프트웨어 엔지니어의 한국/미국 직장생활소프트웨어 엔지니어의 한국/미국 직장생활
소프트웨어 엔지니어의 한국/미국 직장생활
Joon Hong
 
Go Profiling - John Graham-Cumming
Go Profiling - John Graham-Cumming Go Profiling - John Graham-Cumming
Go Profiling - John Graham-Cumming Cloudflare
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
DongMin Choi
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
김종욱 포트폴리오
김종욱 포트폴리오김종욱 포트폴리오
김종욱 포트폴리오
Jonguk Kim
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
내훈 정
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
 
심성환 개발자 포트폴리오
심성환 개발자 포트폴리오심성환 개발자 포트폴리오
심성환 개발자 포트폴리오
Seonghwan Shim
 
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
JinKwon Lee
 
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
Sangik Bae
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
Ho Gyu Lee
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
noerror
 
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
Jongwon Kim
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
준철 박
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
 

What's hot (20)

혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버혼자서 만드는 MMO게임 서버
혼자서 만드는 MMO게임 서버
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
황규영 포트폴리오
황규영 포트폴리오황규영 포트폴리오
황규영 포트폴리오
 
소프트웨어 엔지니어의 한국/미국 직장생활
소프트웨어 엔지니어의 한국/미국 직장생활소프트웨어 엔지니어의 한국/미국 직장생활
소프트웨어 엔지니어의 한국/미국 직장생활
 
Go Profiling - John Graham-Cumming
Go Profiling - John Graham-Cumming Go Profiling - John Graham-Cumming
Go Profiling - John Graham-Cumming
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
김종욱 포트폴리오
김종욱 포트폴리오김종욱 포트폴리오
김종욱 포트폴리오
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
심성환 개발자 포트폴리오
심성환 개발자 포트폴리오심성환 개발자 포트폴리오
심성환 개발자 포트폴리오
 
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
 
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
KGC 2014 프로파일러를 이용한 게임 클라이언트 최적화
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 

Similar to TCP가 실패하는 상황들

TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수
Yeon Soo Kim
 
[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?
용민 박
 
Cse342 chapter 04
Cse342 chapter 04Cse342 chapter 04
Cse342 chapter 04
Jinil Nam
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
세빈 정
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
cooddy
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현noerror
 
TCP 연결 과정_Wh apm
TCP 연결 과정_Wh apmTCP 연결 과정_Wh apm
TCP 연결 과정_Wh apm
엑셈
 
스트리밍 프로토콜
스트리밍 프로토콜스트리밍 프로토콜
스트리밍 프로토콜
greenday96
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
Nam Hyeonuk
 
Icmp Attak Against Tcp
Icmp Attak Against TcpIcmp Attak Against Tcp
Icmp Attak Against Tcpxyzlee
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
Sung-jae Park
 
SMTP 프로토콜 (rfc281, rfc2821)
SMTP 프로토콜 (rfc281, rfc2821)SMTP 프로토콜 (rfc281, rfc2821)
SMTP 프로토콜 (rfc281, rfc2821)
Jua Alice Kim
 
글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation
글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation
글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation
Jonghyon Sohn
 
HTTP 완벽가이드 4장 커넥션관리
HTTP 완벽가이드 4장 커넥션관리HTTP 완벽가이드 4장 커넥션관리
HTTP 완벽가이드 4장 커넥션관리
박 민규
 
KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직
KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직
KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직
Hyunjik Bae
 
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
Hyunjik Bae
 
grade server - block socket
grade server - block socketgrade server - block socket
grade server - block socket
Gyuhyeon Nam
 
HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명
HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명
HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명
Seongho Lee
 
Netmanias L2,L3 Training (1) L2 Ethernet
Netmanias L2,L3 Training (1) L2 EthernetNetmanias L2,L3 Training (1) L2 Ethernet
Netmanias L2,L3 Training (1) L2 Ethernet
Chris Changmo Yoo
 

Similar to TCP가 실패하는 상황들 (20)

TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수
 
[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?[네트워크] TCP, 믿을 수 있나요!?
[네트워크] TCP, 믿을 수 있나요!?
 
Cse342 chapter 04
Cse342 chapter 04Cse342 chapter 04
Cse342 chapter 04
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현
 
TCP 연결 과정_Wh apm
TCP 연결 과정_Wh apmTCP 연결 과정_Wh apm
TCP 연결 과정_Wh apm
 
스트리밍 프로토콜
스트리밍 프로토콜스트리밍 프로토콜
스트리밍 프로토콜
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
Icmp Attak Against Tcp
Icmp Attak Against TcpIcmp Attak Against Tcp
Icmp Attak Against Tcp
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
 
SMTP 프로토콜 (rfc281, rfc2821)
SMTP 프로토콜 (rfc281, rfc2821)SMTP 프로토콜 (rfc281, rfc2821)
SMTP 프로토콜 (rfc281, rfc2821)
 
글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation
글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation
글로벌 모바일 네트워크 환경 이해 Understanding global mobile network situation
 
HTTP 완벽가이드 4장 커넥션관리
HTTP 완벽가이드 4장 커넥션관리HTTP 완벽가이드 4장 커넥션관리
HTTP 완벽가이드 4장 커넥션관리
 
KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직
KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직
KGC 2014: 클라이언트 개발자를 위한 컴퓨터 네트워크 기초 배현직
 
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
 
퀴즈요약
퀴즈요약퀴즈요약
퀴즈요약
 
grade server - block socket
grade server - block socketgrade server - block socket
grade server - block socket
 
HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명
HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명
HTTP와 HTTPS의 차이 그리고 SSL에 대한 설명
 
Netmanias L2,L3 Training (1) L2 Ethernet
Netmanias L2,L3 Training (1) L2 EthernetNetmanias L2,L3 Training (1) L2 Ethernet
Netmanias L2,L3 Training (1) L2 Ethernet
 

TCP가 실패하는 상황들

  • 1. 9. TCP는 Reliable Protocol이지만 Infallible Protocol은 아니라는 것을 알아야 한다. TCP가 실패하는 상황들 김태우 내용, 그림 출처 Effective TCP/IP Programming By Jon C. Snader
  • 2. TCP는 마법이 아니다. TCP가 모든 경우에 대해 데이터 전송을 보장하는 것은 아니다. 상대가 연결을 종료하면 TCP도 어쩔 수 없다.
  • 3. TCP가 “진짜” 보장하는 것 TCP는 end-to-end 프로토콜이다. 연결이 지속된다고 가정할 때, End와 end간에 모든 데이터가 손상되지 않은 상태로 순서 대로 도착하는 것을 보증한다. 하지만! 여기서의 end는 TCP 계층. A와 B간의 전송은 보장하지 않는다.
  • 4. TCP가 실패하는 경우 1. Network Outage(기능 상실) 2. Peer Application Crash 3. Peer Host Crash
  • 5. 1.Network Outage 1. End point에서 먼 곳의 문제  라우터가 다른 경로를 찾음 2. 중간 라우터의 문제  ICMP 메시지가 에러를 전송. 3. End point(수신측의 TCP계층)에서 문제가 생긴 경우  TCP가 포기하거나 오류가 보고될 때까지 계속 요청하게됨.
  • 6. 2. Peer Application Crash 1. Peer Application이 Crash되면 우리에게 FIN을 보낸다. 2. 이 경우 Peer에서 실제로 문제가 발생한 경우와 Peer가 close 를 호출한 경우를 구분할수 없다. 3. FIN이 close를 의미할수도 있으니 우리측은 남은 메시지를 전 송하게 됨. 4. 상대측은 연결이 존재하지 않으므로 RST로 응답한다.
  • 7. Client Server 1. FIN 2. Left data 3. RST
  • 8. ※ Application이 FIN을 받는 타이밍 클라이언트 서버
  • 9. 1. 서버가 응답을 전송한 뒤 꺼진 상황 • 클라이언트의 애플리케이션의 send가 데이터를 커널 버퍼에 복사하고 리턴 • 클라이언트의 TCP가 데이터를 전송 • 서버의 TCP가 ACK전송 • 서버의 애플리케이션이 커널 버퍼로 부터 readline으로 입력을 받아옴 • 서버의 애플리케이션이 send로 커널 버퍼에 에코 메시지 복사후 리턴 • 서버의 TCP가 클라이언트 TCP에게 데이터 전송 한뒤 • 서버 애플리케이션이 죽으면서 서버의 TCP가 FIN을 보냄 • 클라이언트의 애플리케이션은 readline을 한뒤에 FIN이 와서 fgets로 넘어갔고, • 클라이언트의 TCP는 FIN에 대한 ACK는 보냈으나 여전히 close명령을 받지 않았으므로 FIN은 보내지 않는다. • 이때 클라이언트의 애플리케이션은 사용자 입력을 받고 있으므로 FIN이 왔다는 것을 알수 없어 close를 하지 않는다. • 클라이언트의 애플리케이션은 사용자 입력을 받은 후 send를 하고 • 클라이언트의 TCP는 이를 받아서 전송한다. • 서버의 TCP는 이 데이터를 받고는 커넥션이 끝났다는 것을 알리려 RST를 보내고 • 클라이언트는 이 데이터를 readline을 통해 알게 되어 close를 하게 된다.
  • 10. 2. 서버가 응답을 전송하기 전에 꺼진 상황 • 클라이언트의 애플리케이션의 send가 데이터를 커널 버퍼에 복사하고 리턴 • 클라이언트의 TCP가 데이터를 전송 • 서버의 TCP가 ACK전송 • 서버 애플리케이션이 죽으면서 서버의 TCP가 FIN을 보냄 • 클라이언트의 애플리케이션은 이 데이터를 readline을 통해 알게되어 close를 하게 된다.
  • 11. 언제 문제가 되나? • 읽기 없이 여러번 쓰기를 하는 Application에서 흔하게 발생 • 문제 발생 후 한번 더 전송한 이후에 애플리케이션이 상대의 문 제를 알게되는 것이 문제.
  • 12. 3. Peer Host Crash 1. Peer의 TCP가 FIN을 통해 재난을 알릴수 없다. 2. Peer 호스트가 재부팅 될 때까지 네트워크 장애로 인식. 3. TCP는 세그먼트들을 계속 재전송한다. 4. 끝까지 재부팅을 하지 않으면, 우리측 애플리케이션이 TIMEOUT 오류를 반환한다. 5. 그전에 재부팅이 될때는 우리측의 세그먼트가 서버측에 도달 하면 TCP는 RST를 반환한다.
  • 13. Client Sever 1. TIMEOUT 전까지 재전송 2. 재부팅 -> RST 전송
  • 14. 결론 • TCP에도 다양한 실패상황들이 존재한다. • TCP의 한계를 알고 대비해야한다.