[TCP] 왜 받지를 못하니

정강산·2023년 2월 2일
0
  1. 클라이언트가 서버와 연결되면, "hahahahaha"라는 문자열을 담은 패킷을 보낸다.
  2. 서버는 { 클라이언트의 ID, 받은 문자열 } 패킷을 클라이언트에게 돌려준다.

간단한 에코 서버를 만들었는데, 클라이언트가 서버가 돌려준 패킷을 받질 않는다...

가정 1) 데이터가 전송되지 않았다.

Wireshark라는 패킷 분석 프로그램으로 해당 포트를 감시해봤다.

  • 클라이언트 --> 서버:
    패킷 고유 번호(2) + 문자열 길이(2) + 문자열(20) = 24 bytes
  • 서버 --> 클라이언트:
    패킷 고유 번호(2) + 플레이어 ID(2) + 문자열 길이(2) + 문자열(20) = 26 bytes

의도한 패킷의 구조로 전송이 있긴 하다.


"hahahahaha" 데이터가 보인다. Unicode로 인코딩 되어서 각 문자마다 2바이트인걸 볼 수 있다.

SYN? ACK? PSH?

그래서 받았니? 이때까지 존재만 알고 넘어갔던 TCP 연결 설정, 데이터 전송을 다시 짚고 넘어 가야겠다.

연결 설정

3-Way Handshake

방향플래그넘버
1C -> SSYNSeq(a)
2S -> CSYN, ACKSeq(b), Ack(a+1)
3C -> SSYNAck(b+1)

* C = Client, S = Server

데이터 전송

(정상적인) 데이터 전송은 송신 패킷, 수신 완료 패킷 2번으로 나뉜다.

방향플래그넘버
1A -> B(PSH), ACKSeq(i), Ack(j), Len(n)
2B -> AACKSeq(j), Ack(i+n)
  • SYN: 연결을 시작한다
  • ACK: 수신 된 데이터를 확인한다
  • PSH: 데이터를 버퍼에 쌓지 않고 즉시 처리

가정 1은 틀렸다

Wireshark 덤프를 보면, 두 번의 패킷 전송은 정상적으로 일어났다. 좋지만 안좋은 소식...

가정 2) 버그가 있다!

To be continue...

참고

https://techlog.gurucat.net/314

0개의 댓글