TCP라는 것의 연결이라는 것은 물리적인 연결이 아닌 논리적인 연결입니다.
상대방이 "나 데이터 못받음"이라고 뭔가 신호를 줘야지만 그제서야 연결 종료가 되는 것입니다.
TCP에서는 응용프로그램에서 데이터를 전송 "요청" 하면 버퍼에 쌓아둡니다.
그리고 TCP의 알고리즘에 따라 상대방이 받을 수 있으면 그제서야 전송합니다.
write함수에서 -1을 리턴 하지 않은건 버퍼에 데이터를 잘 썼다는 의미이지 그게 실제로 상대방이 제대로 받았다는 의미가 아닙니다.
일단은 버퍼에 쓰긴 썼는데 TCP는 데이터를 전송하려고 시도를 합니다.
상대방이 잘 받으면 괜찮은데 어떠한 문제가 생겨서 전송이 안되면 몇번 더 시도를 합니다.
이러다가도 못하면 TCP는 끊김으로 간주하고 그때서야 비로소 응용프로그램이 write를 시도할 때 -1을 리턴합니다.
그런데 이렇게 시도하고 기다리리는 시간이 꽤나 깁니다.
그 동안은 보내는 측에서는 상대방이 아직 연결중이라고 알고 있습니다.
일반적인 인터넷에 물린 상황이라면 상대방이 운영체제를 정상적으로 셧다운 하면 바로 보내는 측에서
끊겼다는걸 알아차리게 됩니다. 하지만 모바일은 조금 다릅니다.
모바일의 네트워크를 매우 간략하게 표현하자면...
서버--------인터넷--------모바일네트워크--------단말기
이런식입니다. 단말기가 직접 인터넷에 연결되어있는 것이 아니라 WCDMA이라면 그에 맞는 네트워크가 구성되어있고
LTE라면 또 그에 맞는 네트워크가 구성되어있으며 이러한 모바일 네트워크와 인터넷을 연결해주는 장비가 따로 있습니다. 이를 게이트웨이라고 합니다.
그런데 모바일의 특성상 무선입니다...
무선이라는 상황은 단말기가 이동 중일 수도 있고 정지상태일수도 있고 건물내일수도 있고 벼락치는 들판 한복판일 수도 있습니다.
이동중이라면 핸드오버가 일어날 가능성이 높고 건물내라면 전파가 안닿을수도 있으며 벼락치는 들판 한복판의 경우에는 벼락으로 인해 전파방해가 일어날 수 도 있습니다.
이러한 예외 상황에서 전화를 하거나 인터넷을 하면 잘 됩니다. 조금 음성이 끊기거나 느려서 그렇지...
이런 상황에서 단말기가 응답이 없다고 해서 단말이 죽거나 전원이 꺼진 상태가 아니라 일시적인 전파장애로인해
통신이 안되고 있는 상황이므로 잠시 후면 다시 단말에서 응답이 올것 이므로 연결 세션을 유지 시켜줘야합니다.
그렇기 때문에 실제 단말이 꺼졌다고 해서 인터넷과 모바일 네트워크를 연결해주는 게이트웨이는 이를 연결 종료로 인식하기까지는 많은 시간이 걸리게 됩니다.
만약에 즉각적인 연결 종료를 인식해야한다면 정해진 시간동안 heart beet 패킷을 주고 받으면서 정해진 시간안에 패킷이 안오면 종료로 인식하거나 해서 종료 처리를 해야합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
넌블럭킹 옵션이..
넌블럭킹 이 설정되었는지 확인해보세요.
상대가 모바일이라면 약간 고민을
상대가 모바일이라면 약간 고민을 해보셔야합니다.
TCP라는 것의 연결이라는 것은 물리적인 연결이 아닌 논리적인 연결입니다.
상대방이 "나 데이터 못받음"이라고 뭔가 신호를 줘야지만 그제서야 연결 종료가 되는 것입니다.
TCP에서는 응용프로그램에서 데이터를 전송 "요청" 하면 버퍼에 쌓아둡니다.
그리고 TCP의 알고리즘에 따라 상대방이 받을 수 있으면 그제서야 전송합니다.
write함수에서 -1을 리턴 하지 않은건 버퍼에 데이터를 잘 썼다는 의미이지 그게 실제로 상대방이 제대로 받았다는 의미가 아닙니다.
일단은 버퍼에 쓰긴 썼는데 TCP는 데이터를 전송하려고 시도를 합니다.
상대방이 잘 받으면 괜찮은데 어떠한 문제가 생겨서 전송이 안되면 몇번 더 시도를 합니다.
이러다가도 못하면 TCP는 끊김으로 간주하고 그때서야 비로소 응용프로그램이 write를 시도할 때 -1을 리턴합니다.
그런데 이렇게 시도하고 기다리리는 시간이 꽤나 깁니다.
그 동안은 보내는 측에서는 상대방이 아직 연결중이라고 알고 있습니다.
일반적인 인터넷에 물린 상황이라면 상대방이 운영체제를 정상적으로 셧다운 하면 바로 보내는 측에서
끊겼다는걸 알아차리게 됩니다. 하지만 모바일은 조금 다릅니다.
모바일의 네트워크를 매우 간략하게 표현하자면...
서버--------인터넷--------모바일네트워크--------단말기
이런식입니다. 단말기가 직접 인터넷에 연결되어있는 것이 아니라 WCDMA이라면 그에 맞는 네트워크가 구성되어있고
LTE라면 또 그에 맞는 네트워크가 구성되어있으며 이러한 모바일 네트워크와 인터넷을 연결해주는 장비가 따로 있습니다. 이를 게이트웨이라고 합니다.
그런데 모바일의 특성상 무선입니다...
무선이라는 상황은 단말기가 이동 중일 수도 있고 정지상태일수도 있고 건물내일수도 있고 벼락치는 들판 한복판일 수도 있습니다.
이동중이라면 핸드오버가 일어날 가능성이 높고 건물내라면 전파가 안닿을수도 있으며 벼락치는 들판 한복판의 경우에는 벼락으로 인해 전파방해가 일어날 수 도 있습니다.
이러한 예외 상황에서 전화를 하거나 인터넷을 하면 잘 됩니다. 조금 음성이 끊기거나 느려서 그렇지...
이런 상황에서 단말기가 응답이 없다고 해서 단말이 죽거나 전원이 꺼진 상태가 아니라 일시적인 전파장애로인해
통신이 안되고 있는 상황이므로 잠시 후면 다시 단말에서 응답이 올것 이므로 연결 세션을 유지 시켜줘야합니다.
그렇기 때문에 실제 단말이 꺼졌다고 해서 인터넷과 모바일 네트워크를 연결해주는 게이트웨이는 이를 연결 종료로 인식하기까지는 많은 시간이 걸리게 됩니다.
만약에 즉각적인 연결 종료를 인식해야한다면 정해진 시간동안 heart beet 패킷을 주고 받으면서 정해진 시간안에 패킷이 안오면 종료로 인식하거나 해서 종료 처리를 해야합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
댓글 달기