와이어샤크를 킨 후에  한국 인터넷진흥원에 접속합니다.







너무많으니까 HTTP로 필터를 주고 GET표시난것 클릭하셔서 URI가 kisa.or.kr 인 패킷에 오른쪽 클릭을 합니다.
그리고 Follow ->TCP Stream 을 하면 그 패킷의 흐름만 볼 수 있습니다.
그런식으로 아무 사이트에 접속을 해봅시다.






1. 클라이언트 -> 서버 에게 SYN 을 보냅니다.
2. 서버->클라이언트 SYN,ACK를 보냅니다
3. 클라이언트->서버 에게 ACK를 보냅니다.
이로써 클라이언트와 서버간에 연결이 되었습니다. 이 연결을 3핸드 쉐이킹이라고 합니다.







cmd에서 netstat -an 을 입력하면 현재 연결되어있는 ip와 포트를 확인할 수 있습니다.
ESTABLISHED라고 나온것이 연결되어 있는 것입니다.







밑에 UDP연결들은 보시면 내것만 나와있고 상대편것은 나와있지 않습니다. 이렇게 UDP는 누가 들어와도 상관하지 않습니다. 3핸드쉐이킹을 하지 않아서 완벽한 연결이 없습니다.











다시보면 
4.HTTP (웹페이지)를 GET 하는 명령을 서버에게 보냅니다.
5.서버는 ACK로 알겠다고 응답합니다.
6.서버가 전송을 시작합니다. 이때 패킷이 클때 단편화를 하며 보내는데 Ack=537이 되어있는 것은 하나의 패킷을 단편화 한 것입니다. 








Seq Number는 1 응답하면서 +1 응답을 한다하고 1로 되었고
ack는 537입니다. 이제 다음 sequence number는 1에 TCP Segment Len을 더한 1461입니다. 
다음 패킷을 보면








Sequence number가 1461인것을 볼 수 있고. 그다음 Seq num은 1461+1460인 1921인것을 알 수있습니다. ACK=537 이므로 전에 패킷과 하나의 덩어리라는 것입니다.
계속 보내다가








IP 192(클라이언트)는 14(서버)에게 중간중간에 seq 537번 (서버에겐 ack=537입니다)
에 있는 자료 2921번까지 잘 받았다. 라는 응답을 합니다. 이것은 지정된 시간에 보내도록 한 약속입니다. 중간중간에 확인체크가 잘 되면








서버는 클라이언트에게 다시 전송을 시작합니다.(2921부터 다시 시작)








중간중간 Flag에 ack말고 Push가 1로 올라온 경우가 있습니다 [PSH,ACK]
이것은 중간중간 데이터버퍼가 쌓이면 다음계층으로 보내는 역할을 합니다.
데이터 모아뒀다가 어느정도 쌓이면 다음으로 보내고, 다시 모아두면 보내고 하는 역할을 PSH가 합니다.









그리고 클라이언트가 서버에게 TCP Window Update라는 패킷을 보내는데 이것은 버퍼가 얼마나 남았는지 많은지 적은지를 보내주고 남은 크기에따라 서버가 보내는 속도를 조절하면서 합니다.
이것이 흐름제어 이고 슬라이딩 윈도우 기법입니다.








이 패킷 아래에 설명을 보시면 
[Calculated windo size: ---] 가있는데 이것이 0이면 보내는 것을 중단합니다.







이렇게 전송을 다하면 
1.서버는 클라이언트에게 다보냈다는 OK사인을 보내고
2.클라이언트는 서버에게 ACK 사인을 보내고 
3.TCP Window 사이즈를 보내주고 혹시 남아있는 패킷을 위해 잠시 기다립니다.
4.그리고 [FIN,ACK]사인을 보내고 연결의 종료를 알려줍니다
5.[ACK]를 서버는 보내주고 연결이 종료됩니다.
이와같이 전송완료/종료(서버)->알겠음(클라이언트)->잠깐기다림->종료확인(클라이언트)->서버(확인)
하는 것을 '우아한 종료' 라고 합니다.








[FIN,ACK] 패킷에 FIN Flag가 올라온 모습입니다


+ Recent posts