C++ 네트워크 Tcp 통신에 관련 된 질문입니다.
글쓴이: kanglanguage / 작성시간: 금, 2016/10/28 - 3:19오후
특정 데이터의 모음을 패킷이라고 하고 실제 send(보내는)과정에서 해당 패킷을 보낸다고 했을 때.
순서에 관련 된 질문입니다.
A클라이언트와 B클라이언트가 있다고 했을 때
A클라이언트에서 A, B패킷을 보냈을 때 서버에서 A, B순서로 패킷을 받는가? 입니다.
또, A클라이언트에서 A패킷을 보내고 그 다음 B클라이언트에서 B패킷을 보내면
서버에서는 A클라이언트의 A패킷, B클라이언트의 B패킷을 순서대로 받는가? 입니다.
결론:
1. 클라이언트에서 순서에 맞춰 패킷을 보내면, 서버에서 해당 패킷을 순서대로 받는가?
2. 클라이언트가 다른 경우에도 해당 법칙이 적용되는가?
해당 정보를 어디서 찾아야 할 지 모르겠습니다.
신뢰성이 있는 연결이라고만 적혀 있어서 '패킷을 보내면 해당 패킷의 정보는 확실하게 받는다.' 인건지..
어느 글에서는 '안 된다.' 라고 하고 어느 글에서는 '된다' 라고 하기에 더욱 헷갈려서 내공이 심후한 kldp에 여쭤봅니다..!
Forums:
아..참!
실제 응용프로그램이 운영체제로부터 패킷을 전달받아 사용하게 될 때의 이야기였습니다.
tcp에서는 "순서, 실패시-재전송"을 보장 합니다.
tcp에서는 "순서, 실패시-재전송"을 보장 합니다.
단, 패킷단위가 아니라 byte(stream)단위 관리하기 때문에 버퍼에 패킷간의 경계가 없습니다.
이것은 유저가 해주어야 할 일입니다.
감사합니다. 찾아보던 도중 '동기, 비동기'
감사합니다. 찾아보던 도중 '동기, 비동기' IOCP에 관련된 글을 보게 되었는데. 해당 부분에서 제가 궁금해하던 부분을 찾아낼 수 있었습니다.
감사합니다. 찾아보던 도중 '동기, 비동기'
감사합니다. 찾아보던 도중 '동기, 비동기' IOCP에 관련된 글을 보게 되었는데. 해당 부분에서 제가 궁금해하던 부분을 찾아낼 수 있었습니다.
송신측에서 쏜다고 수신측에서 100% 다 받는다는
송신측에서 쏜다고 수신측에서 100% 다 받는다는 보장은 없습니다. 단, 순서는 확실히 보장됩니다.
쓰는 쪽 입장에서는 중간에 언제든지 끊어질 수 있는 스트림(물결)이라고 생각하시면 될겁니다.
예를 들어 송신측에서 tcp로 20kbytes 쐈는데 10k~11k 사이 1kbytes가 없어지고 나머지가 모두 서버에 도착할 경우 os에서 없어진 1kbytes를 다시 요청해서 받아다 재조립해서 20kbytes를 자동으로 순서대로 맞춰 넘겨줍니다. tcp 받는 프로그램은 걍 받아서 쓰면 됩니다.
그런데 사라진 1k에 대한 재전송 복구를 시도했는데도 도저히 복구할 수 없을 경우 수신측에는 제대로 된 앞 10k만 전송해주고 끝입니다. 없어진 부분 이후는 그냥 버리고 connection reset 떨어져 버립니다.
Written By the Black Knight of Destruction
댓글 달기