본문 바로가기

분류 전체보기91

정지 문제(Halting problem)의 간단한 증명 증명을 위해 정지 문제를 판별할 수 있는 함수 H가 존재한다고 하자. (귀류법) 함수 H는 판별할 함수 I를 인자로 받는다. 이 때 함수 J를 아래와 같이 정의하면 모순이 발생한다. J의 인자로 J를 제공하면, - H(J)가 참이라면 J는 언젠가 끝난다는 뜻이지만 J는 무한루프에 의해 끝나지 않는다. - H(J)가 거짓이라면 J는 끝나지 않는다는 뜻이지만 J는 return문에 의해 끝나게 된다. 따라서 이는 모순이다. 2023. 4. 28.
2-way handshake를 사용하지 않는 이유? 3-way handshake에 대해 알아보다 문득 2-way를 사용하지 않는 이유가 궁금해졌는데, 이에 내가 알아본 바를 간략하게 정리해보려고 한다. 위 그림처럼 timeout이 발생하면 isn이 어긋나게 된다 구글에 2-way handshake를 검색하면 바로 나오는 그림인데, 뭔가 그럴듯해 보인다. 그러나 아무리 눈을 씻고 찾아봐도 2-way에 대한 ieee 표준은 찾아볼 수가 없으니... 따라서 저 그림도 표준은 아닐 것이고, 실제로 서버가 ACK+SYN을 보내면 해결되는 문제다. 신뢰할 수 없다 호스트의 입장에서 연결을 신뢰하려면 아래 사항이 모두 확인되어야 한다. (1) 상대방에게 패킷을 전달할 수 있다. (2) 상대방으로부터 패킷을 전달받을 수 있다. 그러나 2-way에서는 일부만 확인된다. .. 2023. 4. 18.
와이어샤크로 DHCP 패킷 캡쳐하기 *이 글은 위키의 내용을 참고하여 작성하였습니다 Wireshark/DHCP - Wikiversity Wireshark is a free and open source packet analyzer used for network troubleshooting and analysis. These activities will show you how to use Wireshark to capture and analyze Dynamic Host Configuration Protocol (DHCP) traffic. To prepare for this activity: en.wikiversity.org 언제 한번 와이어샤크를 써봐야겠다 하고 벼르고 있었는데, 마침 DHCP에 대한 호기심이 생겨서 와이어샤크를 설치하게 되었.. 2023. 3. 14.
백준 15652 C#) N과 M (4) 이전에 풀었던 N과 M (1)과 거의 유사한 문제다. class Program { static StreamWriter sw = new(new BufferedStream(Console.OpenStandardOutput())); static int n, m; static int[] result; static void DFS(int depth, int start) { if (depth == m) { sw.WriteLine(string.Join(' ', result)); return; } for (int i = start; i 2023. 3. 8.
내 패킷은 몇 개의 라우터를 거칠까? 오늘 교수님께서 이러한 질문을 하셨다. "패킷이 미국까지 도달하려면 얼마나 많은 라우터를 거쳐야 할까?" 아무것도 모르던 나는 수백개의 라우터를 거쳐야 할 것이라 생각했는데, 예상 외로 수십개 정도만 거치면 된다는 답변을 듣고 실제로 그러한지 알아보기로 했다. tracert 명령어를 통해 미국의 at&t 서버로 가는 경로를 찾아보았다. 실제로 내 패킷이 att.com까지 도달하는 데에는 22홉밖에 걸리지 않았다. 구글 dns 서버인 8.8.8.8까지도 11홉만에 도달할 수 있었다. 세상에 라우터가 얼마나 많은데 고작 열댓개로 미국까지 패킷을 보낼 수 있다니... 세상물정을 모르고 살았나보다. 참고로 tracert는 ping과 동일하게 icmp 프로토콜을 사용하므로 rtt를 구할 수 있다. 2023. 3. 8.
백준 15649 C#) N과 M (1) 백트래킹 및 DFS의 기본을 익힐 수 있는 문제. 시리즈가 굉장히 많으므로 틈틈이 하나씩 풀면 좋다. class Program { static StreamWriter sw = new(new BufferedStream(Console.OpenStandardOutput())); static int n, m; static int[] result; static bool[] visited; static void DFS(int depth) { if (depth == m) { sw.WriteLine(string.Join(' ', result)); return; } for (int i = 1; i 2023. 3. 8.
백준 1002 C#) 터렛 간단한 중~고등학교 수준의 수학 문제. 두 원의 교점 개수를 묻는 문제였다. class Program { static void Main() { StreamWriter sw = new(new BufferedStream(Console.OpenStandardOutput())); int t; int[] xyr; int x1, y1, r1; int x2, y2, r2; double dist; t = int.Parse(Console.ReadLine()); while (t-- > 0) { xyr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse); (x1, y1, r1) = (xyr[0], xyr[1], xyr[2]); (x2, y2, r2) = (xyr[3], x.. 2023. 3. 7.
빅 엔디안과 리틀 엔디안을 직접 확인해보자 메모리는 바이트 단위로 주소를 할당하고 저장한다. 다만 CPU 아키텍쳐마다 바이트를 저장하는 순서가 다르고 이를 빅 엔디언과 리틀 엔디언이라는 명칭으로 구분하고 있다. 빅 엔디언은 큰 자릿수부터 저장하는 것으로, 우리가 평소 16진수를 읽는 순서와 동일하다. 그리고 리틀 엔디언은 그 반대로 이해할 수 있다. 왜 방식이 나뉘었는지를 논하자면 여러 이유가 있겠으나, 나는 간단히 빅 엔디언은 사람이 다루기 쉽고 리틀 엔디언은 머신이 다루기 쉽기 때문으로 이해하고 있다. 위 사진처럼 0x12345678을 저장하는 경우, 빅 엔디안은 읽는 순서 그대로 저장되므로 사람이 다루기가 쉽다. 그러나 리틀 엔디안은 오른쪽부터 읽어야하므로 조금 불편하게 느껴진다. 그래도 머신 입장에서는 리틀 엔디안과 같은 형태가 가산 등의.. 2023. 2. 4.